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

我正在使用以下函数:

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"));

当前回答

对于包含函数,最简单的解决方案是这样的函数:

var contains = function (haystack, needle) {
    return !!~haystack.indexOf(needle);
}

理想情况下,你不会让它成为一个独立的函数,而是helper库的一部分:

var helper = {};

helper.array = {
    contains : function (haystack, needle) {
        return !!~haystack.indexOf(needle);
    }, 
    ...
};

现在,如果你碰巧是那些不幸的人之一,仍然需要支持IE<9,因此不能依赖indexOf,你可以使用这个填充,这是我从MDN:

if (!Array.prototype.indexOf) {
  Array.prototype.indexOf = function(searchElement, fromIndex) {
    var k;
    if (this == null) {
      throw new TypeError('"this" is null or not defined');
    }
    var o = Object(this);
    var len = o.length >>> 0;
    if (len === 0) {
      return -1;
    }
    var n = +fromIndex || 0;

    if (Math.abs(n) === Infinity) {
      n = 0;
    }
    if (n >= len) {
      return -1;
    }
    k = Math.max(n >= 0 ? n : len - Math.abs(n), 0);
    while (k < len) {
      if (k in o && o[k] === searchElement) {
        return k;
      }
      k++;
    }
    return -1;
  };
}

其他回答

博士tl;

function includes(k) {
  for(var i=0; i < this.length; i++){
    if( this[i] === k || ( this[i] !== this[i] && k !== k ) ){
      return true;
    }
  }
  return false;
}

例子

函数包含(k) { (var = 0;I < this.length;我+ +){ 如果(这[我]= = = k | |(这[我]! = =这[我]& & k ! = = k)) { 返回true; } } 返回错误; } 函数日志(味精){ $(“#”)。追加('<div>' + MSG + '</div>'); } var arr = [1, "2", NaN, true]; 加勒比海盗。Includes =包含; log('var arr = [1, "2", NaN, true];'); 日志(“< br / >”); Log ('arr.includes(1): ' + arr.includes(1)); Log ('arr.includes(2): ' + arr.includes(2)); Log ('arr.includes("2"): ' + arr.includes("2")); log('arr.includes(NaN): ' + arr.includes(NaN)); Log ('arr.includes(true): ' + arr.includes(true)); Log ('arr.includes(false): ' + arr.includes(false)); #出{ 字体类型:等宽字体; } < script src = " https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js " > < /脚本> < div id =了> < / div >

再回答

我知道这个问题实际上不是关于是否扩展内置对象,但是OP的尝试和对这个答案的评论突出了这个争论。我13年2月12日的评论引用了一篇文章,很好地概述了这场辩论,但是那个链接坏了,我无法编辑原始评论,因为时间过得太久了,所以我把它放在这里。

如果您希望使用contains方法扩展内置Array对象,那么最好且最负责任的方法可能是使用MDN中的这个polyfill。(另请参阅MDN文章中关于原型继承的部分,其中解释了“扩展内置原型的唯一好理由是向后移植新JavaScript引擎的特性;例如Array。forEach等。”)

if (!Array.prototype.includes) {
  Array.prototype.includes = function(searchElement /*, fromIndex*/ ) {
    'use strict';
    var O = Object(this);
    var len = parseInt(O.length) || 0;
    if (len === 0) {
      return false;
    }
    var n = parseInt(arguments[1]) || 0;
    var k;
    if (n >= 0) {
      k = n;
    } else {
      k = len + n;
      if (k < 0) {k = 0;}
    }
    var currentElement;
    while (k < len) {
      currentElement = O[k];
      if (searchElement === currentElement ||
         (searchElement !== searchElement && currentElement !== currentElement)) {
        return true;
      }
      k++;
    }
    return false;
  };
}

不想要严格的平等,还是想要选择?

function includes(k, strict) {
  strict = strict !== false; // default is true
  // strict = !!strict; // default is false
  for(var i=0; i < this.length; i++){
    if( (this[i] === k && strict) || 
        (this[i] == k && !strict) ||
        (this[i] !== this[i] && k !== k)
    ) {
      return true;
    }
  }
  return false;
}

从ECMAScript6开始,可以使用Set:

var myArray = ['A', 'B', 'C'];
var mySet = new Set(myArray);
var hasB = mySet.has('B'); // true
var hasZ = mySet.has('Z'); // false
var contains = function(needle) {
    // Per spec, the way to identify NaN is that it is not equal to itself
    var findNaN = needle !== needle;
    var indexOf;

    if(!findNaN && typeof Array.prototype.indexOf === 'function') {
        indexOf = Array.prototype.indexOf;
    } else {
        indexOf = function(needle) {
            var i = -1, index = -1;

            for(i = 0; i < this.length; i++) {
                var item = this[i];

                if((findNaN && item !== item) || item === needle) {
                    index = i;
                    break;
                }
            }

            return index;
        };
    }

    return indexOf.call(this, needle) > -1;
};

你可以这样使用它:

var myArray = [0,1,2],
    needle = 1,
    index = contains.call(myArray, needle); // true

CodePen验证/使用

function setFound(){   
 var l = arr.length, textBox1 = document.getElementById("text1");
    for(var i=0; i<l;i++)
    {
     if(arr[i]==searchele){
      textBox1 .value = "Found";
      return;
     }
    }
    textBox1 .value = "Not Found";
return;
}

这个程序检查是否找到给定的元素。Id Text1表示文本框的id, searchele表示要的元素 搜索(得到fron user);如果需要索引,请使用I值

这通常是indexOf()方法的用途。你会说:

return arrValues.indexOf('Sam') > -1