var a = [1, 2, 3];
var b = [3, 2, 1];
var c = new Array(1, 2, 3);
alert(a == b + "|" + b == c);
demo
如何检查这些数组是否相等,并获得一个方法,如果它们相等,则返回true ?
jQuery是否为此提供了任何方法?
var a = [1, 2, 3];
var b = [3, 2, 1];
var c = new Array(1, 2, 3);
alert(a == b + "|" + b == c);
demo
如何检查这些数组是否相等,并获得一个方法,如果它们相等,则返回true ?
jQuery是否为此提供了任何方法?
当前回答
使用map()和reduce():
function arraysEqual (a1, a2) {
return a1 === a2 || (
a1 !== null && a2 !== null &&
a1.length === a2.length &&
a1
.map(function (val, idx) { return val === a2[idx]; })
.reduce(function (prev, cur) { return prev && cur; }, true)
);
}
其他回答
jQuery没有比较数组的方法。然而,下划线库(或类似的Lodash库)确实有这样一个方法:isEqual,它也可以处理各种其他情况(如对象字面量)。坚持提供的例子:
var a=[1,2,3];
var b=[3,2,1];
var c=new Array(1,2,3);
alert(_.isEqual(a, b) + "|" + _.isEqual(b, c));
顺便说一句:下划线还有很多jQuery没有的方法,所以它是jQuery的一个很好的补充。
编辑:正如评论中所指出的,现在只有当两个数组的元素顺序相同时,上述方法才有效,即:
_.isEqual([1,2,3], [1,2,3]); // true
_.isEqual([1,2,3], [3,2,1]); // false
幸运的是,Javascript有一个内置的方法来解决这个问题,sort:
_.isEqual([1,2,3].sort(), [3,2,1].sort()); // true
使用map()和reduce():
function arraysEqual (a1, a2) {
return a1 === a2 || (
a1 !== null && a2 !== null &&
a1.length === a2.length &&
a1
.map(function (val, idx) { return val === a2[idx]; })
.reduce(function (prev, cur) { return prev && cur; }, true)
);
}
在检查数组大小之后,使用for循环检查每个值。
function equalArray(a, b) {
if (a.length === b.length) {
for (var i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
} else {
return false;
}
}
这种方法很糟糕,但我把它留在这里作为参考,所以其他人会避免这种方法:
使用@ninjagecko的选项1最适合我:
Array.prototype.equals = function(array) {
return array instanceof Array && JSON.stringify(this) === JSON.stringify(array) ;
}
a = [1, [2, 3]]
a.equals([[1, 2], 3]) // false
a.equals([1, [2, 3]]) // true
它还将处理null和未定义的情况,因为我们将它添加到数组的原型中,并检查另一个参数是否也是一个数组。
即使这看起来超级简单,但有时它真的很有用。如果你所需要的只是看看两个数组是否有相同的项,并且它们的顺序相同,试试这个:
[1, 2, 3].toString() == [1, 2, 3].toString()
true
[1, 2, 3,].toString() == [1, 2, 3].toString()
true
[1,2,3].toString() == [1, 2, 3].toString()
true
然而,这并不适用于模式高级情况,如:
[[1,2],[3]].toString() == [[1],[2,3]].toString()
true
这取决于你需要什么。