检查数组中是否存在元素

我现在用来检查这个function如下:

function inArray(needle,haystack) { var count=haystack.length; for(var i=0;i<count;i++) { if(haystack[i]===needle){return true;} } return false; } 

有用。 我正在寻找的是是否有更好的方式来做到这一点。

ECMAScript 2016包含专门解决答案的数组包含方法,所以现在是首选的方法。 (截至2016年6月,您将需要使用polyfill,直到所有主stream浏览器本机实现该方法。)

 [1, 2, 3].includes(2); // true [1, 2, 3].includes(4); // false [1, 2, 3].includes(3, 3); // false 

码:

 function isInArray(value, array) { return array.indexOf(value) > -1; } 

执行:

 isInArray(1, [1,2,3]); // true 

更新(2017):

在具有ECMAScript 6支持的现代浏览器中,您可以使用Array.prototype.includes函数,这样可以更轻松地检查数组中是否存在项目:

 const haystack = [1, 2, 3]; const needle = 1; const isInArray = haystack.includes(needle); console.log(isInArray); // true 

只要使用indexOf

 haystack.indexOf(needle) >= 0 

如果您想支持旧的Internet Explorers(<IE9),则必须将当前的代码作为解决方法 。

除非你的清单是sorting的,你需要比较每个值的针。 因此,你的解决scheme和indexOf将不得不平均执行n/2比较。 但是,由于indexOf是一个内置的方法,它可能会使用额外的优化,在实践中会稍微快一点。 请注意,除非您的应用程序经常在列表中search(比如说每秒1000次)或者列表很大(比如说10万个条目),否则速度差别并不重要。

单行代码将返回true或false

 !!(arr.indexOf("val")+1) 

我在Google Chrome 52上多次进行了基准testing,但可以随意将其粘贴到任何其他浏览器的控制台中。


〜1500毫秒,包括(当我使用polyfill时约2700毫秒)

 var array = [0,1,2,3,4,5,6,7,8,9]; var result = 0; var start = new Date().getTime(); for(var i = 0; i < 10000000; i++) { if(array.includes("test") === true){ result++; } } console.log(new Date().getTime() - start); 

〜1050毫秒,indexOf

 var array = [0,1,2,3,4,5,6,7,8,9]; var result = 0; var start = new Date().getTime(); for(var i = 0; i < 10000000; i++) { if(array.indexOf("test") > -1){ result++; } } console.log(new Date().getTime() - start); 

〜650毫秒,自定义function

 function inArray(target, array) { /* Caching array.length doesn't increase the performance of the for loop on V8 (and probably on most of other major engines) */ for(var i = 0; i < array.length; i++) { if(array[i] === target) { return true; } } return false; } var array = [0,1,2,3,4,5,6,7,8,9]; var result = 0; var start = new Date().getTime(); for(var i = 0; i < 10000000; i++) { if(inArray("test", array) === true){ result++; } } console.log(new Date().getTime() - start); 

你可以使用indexOf但不能在上一个版本的Internet Explorer中使用currefully。 码:

 function isInArray(value, array) { return array.indexOf(value) > -1; } 

执行:

 isInArray(1, [1,2,3]); // true 

我build议你使用下面的代码:

 function inArray(needle, haystack) { var length = haystack.length; for (var i = 0; i < length; i++) { if (haystack[i] == needle) return true; } return false; } 

您可以使用underscore.js库中的_contains函数来实现这一点:

 if (_.contains(haystack, needle)) { console.log("Needle found."); }; 

根据你正在寻找的针的大小, Array.filter可能是有用的。 这是一个例子:

 let filtered, arr = ['Haystack', 'Needle']; filtered = arr.filter((elem) => { return elem.toLowerCase() === 'needle'; }); // filtered => ['needle'] 

由于ECMAScript6,可以使用Set:

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

在lodash中,你可以使用_.includes (也包含_.contains)

你可以search整个数组:

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

您可以从起始索引search数组:

 _.includes([1, 2, 3], 1, 1); // false (begins search at index 1) 

searchstring:

 _.includes('pebbles', 'eb'); // true (string contains eb) 

也适用于检查简单的对象数组:

 _.includes({ 'user': 'fred', 'age': 40 }, 'fred'); // true _.includes({ 'user': 'fred', 'age': false }, false); // true 

关于最后一种情况需要注意的一点是它适用于诸如string,数字和布尔值之类的基元,但不能在数组或对象中search

 _.includes({ 'user': 'fred', 'age': {} }, {}); // false _.includes({ 'user': [1,2,3], 'age': {} }, 3); // false