我有两个数组,如何一次比较两个数组。
var arr1= ["a","b","c"];
var arr2 = ["a","c","d"]
if(arr1 == arr2){
console.log(true);
}else{
console.log(false);
}
我有两个数组,如何一次比较两个数组。
var arr1= ["a","b","c"];
var arr2 = ["a","c","d"]
if(arr1 == arr2){
console.log(true);
}else{
console.log(false);
}
var arr1 = ["a","b","c"];
var arr2 = ["a","c","d"];
if (arr1.length == arr2.length
&& arr1.every(function(u, i) {
return u === arr2[i];
})
) {
console.log(true);
} else {
console.log(false);
}
边缘情况的旁注:
===
NaN
由于行为出乎意料,通常认为此类任务略有损坏:
var arr1 = ["a",NaN,"b"];
var arr2 = ["a",NaN,"b"];
if (arr1.length == arr2.length
&& arr1.every(function(u, i) {
return u === arr2[i];
})
) {
console.log(true);
} else {
console.log(false);
}
上面的代码实际上记录了false
因为NaN !== NaN
. 另外,===
无法+0
区分-0
。为了涵盖这两种情况,您可以使用称为“egal”或“is”的更强比较,可以像这样轻松实现:
function is(a, b) {
return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
|| a !== a && b !== b; // true for NaN vs NaN
}
var arr1 = ["a",NaN,"b"];
var arr2 = ["a",NaN,"b"];
if (arr1.length == arr2.length
&& arr1.every(function(u, i) {
// Use "is" instead of "==="
return is(u, arr2[i]);
})
) {
console.log(true);
} else {
console.log(false);
}
[ES6]
最佳答案是好的和足够的。
但是,当您只想比较它的值是否相同时,您必须先对其进行排序。这里不需要排序代码。
if(arr1.length == arr2.length && arr1.every((v) => arr2.indexOf(v) >= 0)) {
console.log(true);
} else {
console.log(false);
}
而且..我认为使用“一些”而不是“每个”更好。
如果这些不一样,“一些”会让你提前退出。- 很少早,但早;)
if(arr1.length == arr2.length && !arr1.some((v) => arr2.indexOf(v) < 0)) {
console.log(true);
} else {
console.log(false);
}
我会为此使用下划线。
var same = (_.difference(arr1, arr2).length == 0)
这是另一个,没有 ES5 every
:
function arrEq(arr1, arr2) {
for (var i = 0; i < arr1.length; i++)
if (arr1[i] != arr2[i])
return false;
return i == arr2.length;
}
最佳答案很好,但我也会考虑使用 Array.prototype:
Array.prototype.equals = function (arr) {
return this.length == arr.length && this.every((u, i) => u === arr[i]);
}
console.log([1,2,3].equals([1,2,3])); // true
console.log([1,2,3].equals([1,3,3])); // false
// BUT!
console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // false, because NaN !== NaN
如果你希望它也适用于 NaN 并区分 +0 和 -0,最好使用这个:
Array.prototype.equals = function (arr) {
function is(a, b) { // taken from the top answer
return a === b && (a !== 0 || 1 / a === 1 / b) // false for +0 vs -0
|| a !== a && b !== b; // true for NaN vs NaN
}
return this.length == arr.length && this.every((u, i) => is(u, arr[i]));
}
console.log(["a",NaN,"b"].equals(["a",NaN,"b"])); // true
我想对“Taihwan Hah”的代码进行一些修改,但无法发表评论(系统告诉我)
所以这是我的修改:
function ArrayEquals(arr1,arr2){
return arr1.length === arr2.length && !arr1.some((v) => arr2.indexOf(v) < 0) && !arr2.some((v) => arr1.indexOf(v) < 0);
}
基本上,我必须检查 but 数组,因为我的数组不包含唯一数字。
我想稍微改进一下来自 staackuser2 的答案:
var same = (arr1.length === arr2.length) && (_.difference(arr1, arr2).length === 0)
或者
var same = (_.difference(arr1, arr2).length === 0) && (_.difference(arr2, arr1).length === 0)
(虽然问题比 v9.0.0 早得多,但是)因为问题是关于节点的 - 从节点 v9.0.0 开始,您可以使用内置的“util”模块的isDeepStrictEqual(arr1, arr2)来比较数组(或对象,或任何与此有关的东西)
const util = require('util');
let arr1 = [1,2,3];
let arr2 = [1,2,3];
let arr3 = [1,3,2];
console.log(util.isDeepStrictEqual(arr1, arr2)) // true
console.log(util.isDeepStrictEqual(arr1, arr3)) // false
也适用于 NaN