我想比较两个数组。。。理想地、有效地。没有什么稀奇古怪的,如果它们是相同的,那就是真的,如果不是,那就是假的。毫不奇怪,比较运算符似乎不起作用。
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对每个数组进行编码,但是否有一种更快或“更好”的方法来简单地比较数组而不必遍历每个值?
令人惊讶的是,没有人提出解决办法
const a = [1, 2, 3]
const b = [1, 2, 3, 4]
a.find((v,i) => v !== b[i])
这里的好处是,它不会比较所有值,而是查找第一次出现的值,并尽早结束循环。换句话说,它不是问“两个数组相等吗?”而是问“一个数组与另一个数组不同吗?”。
绩效基准排名第三https://jsben.ch/TgFrA
记住,顺序很重要,a.find(…)!==b.find(…),可以通过a.length==b.length进行检查
if (a.length === b.length && a.find((v,i) => v !== b[i]) === undefined) {
// equal
}
令人惊讶的是,没有人提出解决办法
const a = [1, 2, 3]
const b = [1, 2, 3, 4]
a.find((v,i) => v !== b[i])
这里的好处是,它不会比较所有值,而是查找第一次出现的值,并尽早结束循环。换句话说,它不是问“两个数组相等吗?”而是问“一个数组与另一个数组不同吗?”。
绩效基准排名第三https://jsben.ch/TgFrA
记住,顺序很重要,a.find(…)!==b.find(…),可以通过a.length==b.length进行检查
if (a.length === b.length && a.find((v,i) => v !== b[i]) === undefined) {
// equal
}
如果数组是普通的,并且顺序很重要,那么这两行可能会有所帮助
//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”只需将其包装到函数中
虽然这只适用于标量数组(请参见下面的注释),但代码很短:
array1.length === array2.length && array1.every(function(value, index) { return value === array2[index]})
与上文相同,但在ECMAScript 6/CoffeeScript/TypeScript中使用箭头函数:
array1.length === array2.length && array1.every((value, index) => value === array2[index])
(注意:这里的“scalar”表示可以使用==直接比较的值。因此:数字、字符串、引用对象、引用函数。有关比较运算符的更多信息,请参阅MDN引用)。
更新
根据我在评论中看到的内容,对数组进行排序和比较可能会得到准确的结果:
const array2Sorted = array2.slice().sort();
array1.length === array2.length && array1.slice().sort().every(function(value, index) {
return value === array2Sorted[index];
});
Eg:
array1 = [2,3,1,4];
array2 = [1,2,3,4];
然后上述代码将返回true