我需要确定数组中是否存在一个值。

我正在使用以下函数:

Array.prototype.contains = function(obj) {
    var i = this.length;
    while (i--) {
        if (this[i] == obj) {
            return true;
        }
    }
    return false;
}

上面的函数总是返回false。

数组值和函数调用如下所示:

arrValues = ["Sam","Great", "Sample", "High"]
alert(arrValues.contains("Sam"));

当前回答

另一种选择是使用Array。部分(如有)采用以下方式:

Array.prototype.contains = function(obj) {
  return this.some( function(e){ return e === obj } );
}

传递给Array的匿名函数。当且仅当数组中存在与obj相同的元素时,一些函数将返回true。如果没有这样的元素,则该函数对于数组的任何元素都不会返回true,因此array .数组将返回true。有些也会返回false。

其他回答

我更喜欢简单:

var days = [1, 2, 3, 4, 5];
if ( 2 in days ) {console.log('weekday');}

使用数组.map函数对数组中的每个值执行一个函数对我来说似乎是最干净的。

裁判:Array.prototype.map ()

此方法既适用于简单数组,也适用于需要查看对象数组中是否存在键/值的对象数组。

function inArray(myArray,myValue){
    var inArray = false;
    myArray.map(function(key){
        if (key === myValue){
            inArray=true;
        }
    });
    return inArray;
};

var anArray = [2,4,6,8]
console.log(inArray(anArray, 8)); // returns true
console.log(inArray(anArray, 1)); // returns false

function inArrayOfObjects(myArray,myValue,objElement){
    var inArray = false;
    myArray.map(function(arrayObj){
        if (arrayObj[objElement] === myValue) {
            inArray=true;
        }
    });
    return inArray;
};

var objArray = [{id:4,value:'foo'},{id:5,value:'bar'}]
console.log(inArrayOfObjects(objArray, 4, 'id')); // returns true
console.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns true
console.log(inArrayOfObjects(objArray, 1, 'id')); // returns false

jQuery有一个实用函数:

$.inArray(value, array)

返回数组中值的索引。如果数组不包含值,则返回-1。

另参见如何检查数组中是否包含JavaScript对象?

从ECMAScript6开始,可以使用Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false

给定IE的indexOf实现(由eyelidlessness描述):

Array.prototype.contains = function(obj) {
    return this.indexOf(obj) > -1;
};