相当于PHP的in_array()

有没有在JavaScript的方式来比较一个数组的值,看看它是否在另一个数组?

类似于PHP的in_array函数?

不,它没有一个。 出于这个原因,大多数stream行的图书馆都配备了一套实用程序。 例如,查看jQuery的inArray和Prototype的Array.indexOf

jQuery的实现就像你所期望的那样简单:

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

如果你正在处理一个相当数量的数组元素,上面将很好地做到这一点。

编辑 :哎呀。 我甚至没有注意到你想看看数组是否在另一个里面。 根据PHP文档,这是PHP in_array的预期行为:

 $a = array(array('p', 'h'), array('p', 'r'), 'o'); if (in_array(array('p', 'h'), $a)) { echo "'ph' was found\n"; } if (in_array(array('f', 'i'), $a)) { echo "'fi' was found\n"; } if (in_array('o', $a)) { echo "'o' was found\n"; } // Output: // 'ph' was found // 'o' was found 

Chris和Alex发布的代码并不遵循这种行为。 Alex's是Prototype的indexOf的正式版本,Chris的更像PHP的array_intersect 。 这就是你想要的:

 function arrayCompare(a1, a2) { if (a1.length != a2.length) return false; var length = a2.length; for (var i = 0; i < length; i++) { if (a1[i] !== a2[i]) return false; } return true; } function inArray(needle, haystack) { var length = haystack.length; for(var i = 0; i < length; i++) { if(typeof haystack[i] == 'object') { if(arrayCompare(haystack[i], needle)) return true; } else { if(haystack[i] == needle) return true; } } return false; } 

而这个我对上面的testing呢:

 var a = [['p','h'],['p','r'],'o']; if(inArray(['p','h'], a)) { alert('ph was found'); } if(inArray(['f','i'], a)) { alert('fi was found'); } if(inArray('o', a)) { alert('o was found'); } // Results: // alerts 'ph' was found // alerts 'o' was found 

请注意,我故意没有扩展数组的原型,因为这样做通常是一个坏主意。

Array.indexOf是在JavaScript 1.6中引入的,但在旧版浏览器中不支持。 幸运的是,Mozilla上的所有操作都为您完成了所有的工作 ,并为您提供了兼容性:

 if (!Array.prototype.indexOf) { Array.prototype.indexOf = function(elt /*, from*/) { var len = this.length >>> 0; var from = Number(arguments[1]) || 0; from = (from < 0) ? Math.ceil(from) : Math.floor(from); if (from < 0) from += len; for (; from < len; from++) { if (from in this && this[from] === elt) return from; } return -1; }; } 

甚至有一些方便的使用片段为您的脚本快感。

如果索引不顺序,或索引不连续,这里列出的其他解决scheme中的代码将会中断。 一个稍微好一些的解决scheme可能是:

 function in_array(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return true; } return false; } 

而且,作为奖励,这里是PHP的array_search(用于查找数组元素的关键字)的等价物:

 function array_search(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return i; } return false; } 

有一个名为Locutus的项目,它在Javascript中实现了PHP函数,并且包含了in_array() ,您可以像在PHP中一样使用它。

使用示例:

 in_array('van', myArray); in_array(1, otherArray, true); // Forcing strict type 

现在有Array.prototype.includes: https : / / dev / oem /

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

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

句法

 arr.includes(searchElement) arr.includes(searchElement, fromIndex) 
 var a = [1,2,3,4,5,6,7,8,9]; var isSixInArray = a.filter(function(item){return item==6}).length ? true : false; var isSixInArray = a.indexOf(6)>=0; 

jQuery的解决scheme是可用的,请检查ducumentation在这里: http ://api.jquery.com/jquery.inarray/

 $.inArray( 10, [ 8, 9, 10, 11 ] ); 

如果你只想检查单个值是否在数组中,那么Paolo的代码就可以完成这个工作。 如果你想检查两个数组的共同值,那么你会想要这样的东西(使用Paolo的inArray函数):

 function arrayIntersect(a, b) { var intersection = []; for(var i = 0; i < a.length; i++) { if(inArray(b, a[i])) intersection.push(a[i]); } return intersection; } 

这将返回ab的值的数组。 (在math上,这是两个数组的交集 。)

编辑:请参阅保罗的编辑代码为您的问题的解决scheme。 🙂

如果你需要所有的PHP可用参数,使用这个:

 function in_array(needle, haystack, argStrict) { var key = '', strict = !!argStrict; if (strict) { for (key in haystack) { if (haystack[key] === needle) { return true; } } } else { for (key in haystack) { if (haystack[key] == needle) { return true; } } } return false; } 

这没有一个本地的function。

这里的代码是很好的。

借助Dojo Toolkit ,您可以使用dojo.indexOf() 。 有关示例 ,请参阅dojo.indexOf获取文档以及Bryan Forbes创build的“ Arrays Made Easy ”。

将此代码添加到您的项目并使用对象样式inArray方法

 if (!Array.prototype.inArray) { Array.prototype.inArray = function(element) { return this.indexOf(element) > -1; }; } //How it work var array = ["one", "two", "three"]; //Return true array.inArray("one"); 
 function in_array(what, where) { var a=false; for (var i=0; i<where.length; i++) { if(what == where[i]) { a=true; break; } } return a; } 

我在这里find了一个很棒的jQuery解决scheme。

 var success = $.grep(array_a, function(v,i) { return $.inArray(v, array_b) !== -1; }).length === array_a.length; 

我希望有人会发表一个如何在下划线做这个例子。

具有underscorein_array的等价物是_.indexOf

例子:

_.indexOf([3, 5, 8], 8); // returns 2, the index of 8 _.indexOf([3, 5, 8], 10); // returns -1, not found

如果您要在课堂上使用它,并且希望它能够正常工作(并在所有浏览器中工作),请执行以下操作:

 inArray: function(needle, haystack) { var result = false; for (var i in haystack) { if (haystack[i] === needle) { result = true; break; } } return result; } 

希望它有助于某人:-)

有一个等价的function:

 includes() 

看这里: https : //developer.mozilla.org/pl/docs/Web/JavaScript/Referencje/Obiekty/Array/includes

 function in_array(needle, haystack){ return haystack.indexOf(needle) !== -1; }