javascript搜索数组数组
Posted
技术标签:
【中文标题】javascript搜索数组数组【英文标题】:javascript search array of arrays 【发布时间】:2011-09-12 23:57:06 【问题描述】:假设我们有以下 js 数组
var ar = [
[2,6,89,45],
[3,566,23,79],
[434,677,9,23]
];
var val = [3,566,23,79];
是否有一个 js 内置函数或 jQuery 函数,您可以使用它在数组 ar 中搜索 val?
谢谢
***更新*************
根据 fusion 的响应,我创建了这个原型
Array.prototype.containsArray = function(val)
var hash = ;
for(var i=0; i<this.length; i++)
hash[this[i]] = i;
return hash.hasOwnProperty(val);
【问题讨论】:
只想添加一个小评论,将this.length
移到循环之外会提高效率。像这样,例如:for (var i = this.length > 0 ? (this.length - 1) : 0; i; i--)
【参考方案1】:
我想没有这样的 JS 功能可用。但你可以创建一个
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;
【讨论】:
但是 OP 想要搜索一个数组,而不是测试两个数组是否相等。 他想在一个数组中搜索一个数组。所以他可以对任何Array的集合使用这个方法。 我是说使用示例会有所帮助。【参考方案2】:你可以创建一个哈希。
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]);
【讨论】:
稍微解释一下就好了。数组在用作对象键时会隐式转换为字符串。 @stereofrog 我明白你的意思。示例数据不包括嵌套数组或字符串值。我的回答是处理特定任务的快速方法,而不是检查数组相等性的通用方法。【参考方案3】:你可以试试这个吗?
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;
【讨论】:
很好,但您在函数外部使用“return”(不必要地)会引发错误。 哎呀!我的错!我实际上写了一个包装这段代码的函数!修改。尽管 return 与此无关。你可以使用休息;在一个循环中【参考方案4】:这个问题是 javascript 中的对象/数组相等问题。本质上,问题在于两个数组不相等,即使它们具有相同的值。您需要遍历数组并将成员与您的搜索键 (val
) 进行比较,但您需要一种准确比较数组的方法。
解决这个问题的最简单方法是使用允许数组/对象比较的库。 underscore.js 有一个非常吸引人的方法来做到这一点:
for (var i = 0; i < ar.length; i++)
if (_.isEqual(ar[i], val))
// value is present
如果您不想使用其他库(尽管我会敦促您 -- 或者至少从 Underscore 来源借用消息),您可以使用 JSON.stringify
...
var valJSON = JSON.stringify(val);
for (var i = 0; i < ar.length; i++)
if (valJSON === JSON.stringify(ar[i])
// value is present
不过,这几乎肯定会明显变慢。
【讨论】:
【参考方案5】:function indexOfArray(val, array)
var hash = ;
for (var i = 0; i < array.length; i++)
hash[array[i]] = i;
return (hash.hasOwnProperty(val)) ? hash[val] : -1;
;
我认为这比containsArray()
更有用。它解决了同样的问题(使用hash table)但返回索引(而不仅仅是布尔值true
/false
)。
【讨论】:
【参考方案6】:您还可以使用 JSON 序列化的技巧。它简短而简单,但有点老套。
它有效,因为 "[0,1]" === "[0,1]"
。
这里是工作演示 sn-p:
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]);
【讨论】:
【参考方案7】:为什么不使用 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() 和 some()
【讨论】:
【参考方案8】:您可以使用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);
【讨论】:
【参考方案9】:你可以使用 toString 转换来比较元素
var ar = [
[2,6,89,45],
[3,566,23,79],
[434,677,9,23]
];
var val = [3,566,23,79];
s = !ar.every(a => (a.toString() != val.toString()));
console.log(s) // true
【讨论】:
【参考方案10】:改用这个
if (ar.join(".").indexOf(val) > -1)
return true;
else
return false;
【讨论】:
以上是关于javascript搜索数组数组的主要内容,如果未能解决你的问题,请参考以下文章
将 C# ASP.NET 数组传递给 Javascript 数组