确定数组是否包含值

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

我正在使用以下功能:

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"));
1760431 次浏览
var contains = function(needle) {// Per spec, the way to identify NaN is that it is not equal to itselfvar 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验证/使用

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

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

给定indexOf for IE的实现(如无眼睑所述):

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

jQuery有一个实用函数:

$.inArray(value, array)

array中返回value的索引。如果array不包含value,则返回-1

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

提供的答案对我不起作用,但它给了我一个想法:

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

它并不完美,因为在分组之外相同的项目最终可能会匹配。比如我的例子

var c=[];var d=[];function a(){var e = '1';var f = '2';c[0] = ['1','1'];c[1] = ['2','2'];c[2] = ['3','3'];d[0] = [document.getElementById('g').value,document.getElementById('h').value];
document.getElementById('i').value = c.join(',');document.getElementById('j').value = d.join(',');document.getElementById('b').value = c.contains(d);}

当我用分别包含1和2的“g”和“h”字段调用这个函数时,它仍然会找到它,因为连接产生的字符串是:1,1,2,2,3,3

因为在我的情况下,我怀疑我是否会遇到这种情况,我正在使用这个。我想我会分享,以防其他人也无法使所选择的答案发挥作用。

tl; dr

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;}

示例

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;}
function log(msg){$('#out').append('<div>' + msg + '</div>');}
var arr = [1, "2", NaN, true];arr.includes = includes;
log('var arr = [1, "2", NaN, true];');log('<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));
#out{font-family:monospace;}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script><div id=out></div>

更长的答案

我知道这个问题并不是关于是否扩展内置对象,但是OP的尝试和对这个答案的评论突出了这场辩论。我在2月12日的评论,'13引用了一篇很好地概述了这场辩论的文章,但是链接断开了,我不能编辑原始评论,因为时间已经过去了,所以我把它包括进去这里

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

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 falsefor(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;}

您可以使用_. indexOf方法,或者如果您不想在应用程序中包含整个Underscore.js库,您可以查看他们是怎么做到的并提取必要的代码。

    _.indexOf = function(array, item, isSorted) {if (array == null) return -1;var i = 0, l = array.length;if (isSorted) {if (typeof isSorted == 'number') {i = (isSorted < 0 ? Math.max(0, l + isSorted) : isSorted);} else {i = _.sortedIndex(array, item);return array[i] === item ? i : -1;}}if (nativeIndexOf && array.indexOf === nativeIndexOf) return array.indexOf(item, isSorted);for (; i < l; i++) if (array[i] === item) return i;return -1;};

我的小小贡献:

function isInArray(array, search){return array.indexOf(search) >= 0;}
//usageif(isInArray(my_array, "my_value")){//...}

使用像豆沙这样的库几乎总是更安全,因为跨浏览器兼容性和效率的所有问题。

效率,因为你可以保证在任何给定的时间,像下划线这样非常流行的库将拥有最有效的方法来完成这样的实用函数。

_.includes([1, 2, 3], 3); // returns true

如果您担心通过包含整个库而添加到应用程序中的批量,请知道您可以单独包含功能:

var includes = require('lodash/collections/includes');

通知:对于旧版本的洛达什,这是_.contains()而不是_.includes()

我更喜欢简单:

var days = [1, 2, 3, 4, 5];if ( 2 in days ) {console.log('weekday');}
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文本1表示文本框的id,搜索器表示要使用的元素搜索(从用户获得);如果要索引,请使用i值

另一种选择是以如下方式使用Array.some如果有的话):

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

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

Array.prototype.includes()

在ES2016中,有#0

includes()方法确定数组是否包含某个元素,并根据需要返回truefalse

示例

["Sam", "Great", "Sample", "High"].includes("Sam"); // true

支持

根据kangaxMDN,支持以下平台:

  • Chrome47
  • 边缘14
  • Firefox 43
  • Opera 34
  • Safari9
  • 节点6

支持可以使用巴别塔(使用babel-polyfill)或#1进行扩展。MDN还提供了聚填充

if (![].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;};}

使用数组. 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 trueconsole.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 trueconsole.log(inArrayOfObjects(objArray, 'bar', 'value')); // returns trueconsole.log(inArrayOfObjects(objArray, 1, 'id')); // returns false

如果您可以访问ECMA 5,则可以使用一些方法。

MDN一些方法链接

arrValues = ["Sam","Great", "Sample", "High"];
function namePresent(name){return name === this.toString();}// Note:// namePresent requires .toString() method to coerce primitive value// i.e. String {0: "S", 1: "a", 2: "m", length: 3, [[PrimitiveValue]]: "Sam"}// into// "Sam"
arrValues.some(namePresent, 'Sam');=> true;

如果您可以访问ECMA 6,则可以使用包括方法。

MDN包括方法链接

arrValues = ["Sam","Great", "Sample", "High"];
arrValues.includes('Sam');=> true;

从ECMAScript6开始,可以使用#0

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

contains函数的最简单解决方案是这样一个函数:

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

理想情况下,您不会将其作为一个独立的函数,而是帮助程序库的一部分:

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;};}

哇,这个问题有很多很好的答案。

我没有看到一个采用reduce方法的,所以我会添加它:

var searchForValue = 'pig';
var valueIsInArray = ['horse', 'cat', 'dog'].reduce(function(previous, current){return previous || searchForValue === current ? true : false;}, false);
console.log('The value "' + searchForValue + '" is in the array: ' + valueIsInArray);

这是它的一个小提琴在行动