找出JavaScript数组是否包含值的最简洁,最有效的方法是什么? javascript
这是我知道的惟一方法: html
function contains(a, obj) { for (var i = 0; i < a.length; i++) { if (a[i] === obj) { return true; } } return false; }
有没有更好,更简洁的方法来实现这一目标? java
这与Stack Overflow问题密切相关。 在JavaScript数组中查找项目的最佳方法? 它解决了使用indexOf
在数组中查找对象的问题。 jquery
虽然array.indexOf(x)!=-1
是执行此操做的最简洁方法(而且已由非Internet Explorer浏览器支持了十多年...),但它不是O(1),而是O( N),这很糟糕。 若是您的数组不会改变,则能够将其转换为哈希表,而后执行table[x]!==undefined
或===undefined
: git
Array.prototype.toTable = function() { var t = {}; this.forEach(function(x){t[x]=true}); return t; }
演示: github
var toRemove = [2,4].toTable(); [1,2,3,4,5].filter(function(x){return toRemove[x]===undefined})
(不幸的是,虽然您能够建立一个Array.prototype.contains来“冻结”一个数组并将哈希表存储在两行中的this._cache中,可是若是您之后选择编辑数组,则会产生错误的结果。JavaScript的钩子不足让您保持这种状态,例如与Python不一样。) ajax
function inArray(elem,array) { var len = array.length; for(var i = 0 ; i < len;i++) { if(array[i] == elem){return i;} } return -1; }
若是找到,则返回数组索引;若是未找到,则返回-1 api
扩展JavaScript Array
对象是一个很是糟糕的主意,由于您在for-in
循环中引入了新属性(您的自定义方法) for-in
这可能会破坏现有脚本。 几年前, 原型库的做者不得不从新设计其库实现,以删除此类内容。 数组
若是您没必要担忧与页面上运行的其余JavaScript的兼容性,请坚持下去,不然,我建议您使用更笨拙但更安全的独立功能解决方案。 浏览器
这是Prototype的工做方式 :
/** * Array#indexOf(item[, offset = 0]) -> Number * - item (?): A value that may or may not be in the array. * - offset (Number): The number of initial items to skip before beginning the * search. * * Returns the position of the first occurrence of `item` within the array — or * `-1` if `item` doesn't exist in the array. **/ function indexOf(item, i) { i || (i = 0); var length = this.length; if (i < 0) i = length + i; for (; i < length; i++) if (this[i] === item) return i; return -1; }
另请参阅此处 ,了解他们如何进行链接。
当前的浏览器有Array#includes
,这正是这么作的, 获得普遍支持 ,并具备填充工具旧版本浏览器。
> ['joe', 'jane', 'mary'].includes('jane'); true
您还可使用Array#indexOf
,它不太直接,但对于过时的浏览器不须要Polyfills。
jQuery提供$.inArray
,在功能上等效于Array#indexOf
。
underscore.js是一个JavaScript实用程序库,提供_.contains(list, value)
和别名_.include(list, value)
,若是传递了JavaScript数组,则二者都在内部使用indexOf 。
其余一些框架提供了相似的方法:
dojo.indexOf(array, value, [fromIndex, findLast])
array.indexOf(value)
array.indexOf(value)
findValue(array, value)
: findValue(array, value)
array.indexOf(value)
Ext.Array.contains(array, value)
_.includes(array, value, [from])
(是_.contains
4.0.0以前的版本) R.includes(value, array)
: R.includes(value, array)
array.includes(value)
注意,有些框架将此功能实现为函数,而其余框架则将该函数添加到数组原型中。