JavaScript equivalent of PHP's in_array()
在javascript中,有没有一种方法可以比较一个数组中的值,并查看它是否在另一个数组中?
类似于php的
不,没有。出于这个原因,大多数流行的库在其实用程序包中都有一个库。查看jquery的inarray和prototype的array.indexof以获取示例。
jquery对它的实现如您所期望的那样简单:
1 2 3 4 5 6 7 | 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的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
克里斯和亚历克斯发布的代码没有遵循这种行为。亚历克斯的是原型的indexof的官方版本,而克里斯的更像是PHP的
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | 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; } |
我在上面的测试是:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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 |
注意,我故意不扩展数组原型,因为这样做通常是一个坏主意。
在javascript 1.6中引入了
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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; }; } |
甚至还有一些方便的使用代码片段,让您享受编写脚本的乐趣。
现在有了
The includes() method determines whether an array includes a certain
element, returning true or false as appropriate.
1 2 3 | var a = [1, 2, 3]; a.includes(2); // true a.includes(4); // false |
Syntax
1 2 | arr.includes(searchElement) arr.includes(searchElement, fromIndex) |
如果索引不按顺序排列,或者索引不连续,则此处列出的其他解决方案中的代码将中断。更好的解决方案可能是:
1 2 3 4 5 6 | function in_array(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return true; } return false; } |
另外,这里还有相当于php的array_search(在数组中查找元素的键:
1 2 3 4 5 6 | function array_search(needle, haystack) { for(var i in haystack) { if(haystack[i] == needle) return i; } return false; } |
有一个名为ocatus的项目,它在javascript中实现了PHP函数,并且包含在_Array()中,您可以像在PHP中那样使用它。
使用示例:
10jquery解决方案可用,请在此处检查文档:http://api.jquery.com/jquery.inarray/
1 | $.inArray( 10, [ 8, 9, 10, 11 ] ); |
1 2 3 4 5 | 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; |
有一个等价函数:
1 | includes() |
看这里:https://developer.mozilla.org/en-us/docs/web/javascript/reference/global_对象/array/includes
如果需要所有可用的PHP参数,请使用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
将此代码添加到项目中并使用对象样式Inray方法
1 2 3 4 5 6 7 8 9 |
如果只想检查数组中是否有单个值,那么paolo的代码就可以完成这项工作。如果要检查两个数组的公共值,则需要类似这样的值(使用paolo的inarray函数):
1 2 3 4 5 6 7 8 9 10 | 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; } |
这将返回在
编辑:有关问题的解决方案,请参阅Paolo的编辑代码。:)
使用Dojo工具包,您可以使用
1 2 3 4 5 6 7 8 9 10 | 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; } |
我在这里找到了一个很好的jquery解决方案。
1 2 3 | var success = $.grep(array_a, function(v,i) { return $.inArray(v, array_b) !== -1; }).length === array_a.length; |
我希望有人能在下面的下划线中发布一个如何做到这一点的示例。
1 2 3 4 |
与
实例:
_.indexOf([3, 5, 8], 10); // returns -1, not found
如果要在类中使用它,并且希望它具有功能性(并且在所有浏览器中都可以使用),请执行以下操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 | inArray: function(needle, haystack) { var result = false; for (var i in haystack) { if (haystack[i] === needle) { result = true; break; } } return result; } |
希望它能帮助别人:-)