我想比较两个数组。。。理想地、有效地。没有什么稀奇古怪的,如果它们是相同的,那就是真的,如果不是,那就是假的。毫不奇怪,比较运算符似乎不起作用。
var a1 = [1,2,3];
var a2 = [1,2,3];
console.log(a1==a2); // Returns false
console.log(JSON.stringify(a1)==JSON.stringify(a2)); // Returns true
JSON对每个数组进行编码,但是否有一种更快或“更好”的方法来简单地比较数组而不必遍历每个值?
本着原问题的精神:
我想比较两个数组。。。理想地、有效地。没有什么想象,如果它们是相同的,则为真,如果不是,则为假。
我一直在对这里提出的一些更简单的建议进行性能测试,结果如下(从快到慢):
而Tim Down(67%)
var i = a1.length;
while (i--) {
if (a1[i] !== a2[i]) return false;
}
return true
每(69%)用户2782196
a1.every((v,i)=> v === a2[i]);
DEI减少(74%)
a1.reduce((a, b) => a && a2.includes(b), true);
Gaizka Allende&vivek的join&toString(78%)
a1.join('') === a2.join('');
a1.toString() === a2.toString();
Victor Palomo创作的半到字符串(90%)
a1 == a2.toString();
radtek的stringify(100%)
JSON.stringify(a1) === JSON.stringify(a2);
注意,下面的示例假设数组是排序的,一维数组。对于一个常见的基准测试,长度比较已被删除(将a1.length==a2.length添加到任何建议中,您将获得约10%的性能提升)。选择最适合您的解决方案,了解每种解决方案的速度和局限性。
如果数组是普通的,并且顺序很重要,那么这两行可能会有所帮助
//Assume
var a = ['a','b', 'c']; var b = ['a','e', 'c'];
if(a.length !== b.length) return false;
return !a.reduce(
function(prev,next,idx, arr){ return prev || next != b[idx] },false
);
Reduce遍历数组之一,如果“a”的至少一个元素与“b”的元素不相等,则返回“false”只需将其包装到函数中
var a1 = [1,2,3,6];
var a2 = [1,2,3,5];
function check(a, b) {
return (a.length != b.length) ? false :
a.every(function(row, index) {
return a[index] == b[index];
});
}
check(a1, a2);
//////或///////
var a1 = [1,2,3,6];
var a2 = [1,2,3,6];
function check(a, b) {
return (a.length != b.length) ? false :
!(a.some(function(row, index) {
return a[index] != b[index];
}));
}
check(a1, a2)
let equals = (LHS, RHS) => {
if (!(LHS instanceof Array)) return "false > L.H.S is't an array";
if (!(RHS instanceof Array)) return "false > R.H.S is't an array";
if (LHS.length != RHS.length) return false;
let to_string = x => JSON.stringify(x.sort((a, b) => a - b));
return to_string(LHS) == to_string(RHS);
};
let l = console.log
l(equals([5,3,2],[3,2,5])) // true
l(equals([3,2,5,3],[3,2,5])) // false