如何检查数组是否在JavaScript中包含值?

找出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


#1楼

虽然array.indexOf(x)!=-1是执行此操做的最简洁方法(而且已由非Internet Explorer浏览器支持了十多年...),但它不是O(1),而是O( N),这很糟糕。 若是您的数组不会改变,则能够将其转换为哈希表,而后执行table[x]!==undefined===undefinedgit

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


#2楼

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


#3楼

扩展JavaScript Array对象是一个很是糟糕的主意,由于您在for-in循环中引入了新属性(您的自定义方法) for-in这可能会破坏现有脚本。 几年前, 原型库的做者不得不从新设计其库实现,以删除此类内容。 数组

若是您没必要担忧与页面上运行的其余JavaScript的兼容性,请坚持下去,不然,我建议您使用更笨拙但更安全的独立功能解决方案。 浏览器


#4楼

这是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 &mdash; 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;
}

另请参阅此处 ,了解他们如何进行链接。


#5楼

当前的浏览器有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

其余一些框架提供了相似的方法:

注意,有些框架将此功能实现为函数,而其余框架则将该函数添加到数组原型中。