javascript数组的数组
假设我们有以下的js数组
var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var val = [3,566,23,79];
有没有一个js内置函数或jQuery之一,你可以search数组ar为val ?
谢谢
** * 更新 * ** * ** * ** * ** *
以融合的反应,我创造了这个原型
Array.prototype.containsArray = function(val) { var hash = {}; for(var i=0; i<this.length; i++) { hash[this[i]] = i; } return hash.hasOwnProperty(val); }
你可以创build一个哈希。
var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var hash = {}; for(var i = 0 ; i < ar.length; i += 1) { hash[ar[i]] = i; } var val = [434,677,9,23]; if(hash.hasOwnProperty(val)) { document.write(hash[val]); }
您也可以使用JSON序列化技巧。 它简短而简单,但是有点怪异。
它工作,因为"[0,1]" === "[0,1]"
。
这是工作演示片段:
Array.prototype.indexOfForArrays = function(search) { var searchJson = JSON.stringify(search); // "[3,566,23,79]" var arrJson = this.map(JSON.stringify); // ["[2,6,89,45]", "[3,566,23,79]", "[434,677,9,23]"] return arrJson.indexOf(searchJson); }; var arr = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; document.body.innerText = arr.indexOfForArrays([3,566,23,79]);
function indexOfArray(val, array) { var hash = {}, indexes = {}, i, j; for(i = 0; i < array.length; i++) { hash[array[i]] = i; } return (hash.hasOwnProperty(val)) ? hash[val] : -1; };
我认为这比containsArray()
更有用。 它解决了同样的问题,但返回的索引,而不是只是布尔值的true
或false
。
我想没有这样的JSfunction可用。 但是你可以创build一个
function arrEquals( one, two ) { if( one.length != two.length ) { return false; } for( i = 0; i < one.length; i++ ) { if( one[i] != two[i] ) { return false; } } return true; }
这个问题与Javascript中的对象/数组相等。 本质上,问题是两个数组不相等,即使它们具有相同的值。 您需要循环访问数组,并将成员与search关键字( val
)进行比较,但是您需要精确比较数组的方法。
最简单的方法是使用允许数组/对象比较的库。 underscore.js有一个非常有吸引力的方法来做到这一点:
for (var i = 0; i < ar.length; i++) { if (_.isEqual(ar[i], val)) { // value is present } }
如果你不想使用另一个库(尽pipe我会敦促你 – 或者至less借用JSON.stringify
源代码的消息),你可以用JSON.stringify
来做到这JSON.stringify
…
var valJSON = JSON.stringify(val); for (var i = 0; i < ar.length; i++) { if (valJSON === JSON.stringify(ar[i]) { // value is present } }
但是,这几乎肯定会慢得多。
你能试试吗?
var ar = [ [2,6,89,45], [3,566,23,79], [434,677,9,23] ]; var val = [3,566,23,79]; var sval = val.join(""); for(var i in ar) { var sar = ar[i].join(""); if (sar==sval) { alert("found!"); break; } }
为什么不使用JavaScript数组函数?
function filterArrayByValues(array, values) { return array.filter(function (arrayItem) { return values.some(function (value) { return value === arrayItem; }); }); }
或者如果你的数组更复杂,并且你只想比较一个属性,但是作为结果返回整个对象:
function filterArrayByValues(array, values, propertyName) { return array.filter(function (arrayItem) { return values.some(function (value) { return value === arrayItem[propertyName]; }); }); }
更多关于使用函数: filter()和一些()
您可以使用Array.prototype.some()
, Array.prototype.every()
来检查每个数组的每个元素。
var ar = [ [2, 6, 89, 45], [3, 566, 23, 79], [434, 677, 9, 23] ]; var val = [3, 566, 23, 79]; var bool = ar.some(function(arr) { return arr.every(function(prop, index) { return val[index] === prop }) }); console.log(bool);