原文: Comparing Arrays in JavaScript – How to Compare 2 Arrays in JS
在用 JavaScript 处理逻辑时,你可能需要比较两个数组,看它们是否相等。
你可能会觉得这不难,因为你可以很容易地使用松散的等于(两个等号 - ==
)或严格的等于(三个等号 - ===
)。但不幸的是,在这种情况下你不能使用它们。
let array1 = [11, 22, 33];
let array2 = [11, 22, 33];
console.log(array1 == array2); //false
console.log(array1 === array2); //false
发生这种情况是因为 JavaScript 数组的类型是 Object:
let arrayType = typeof(array1);
console.log(arrayType); //"Object"
对象的比较不是基于它们的值,而是基于变量的引用:
console.log(array1[0] == array1[0]); //true
console.log(array1[1] === array1[1]); //true
但这并不是你想要的。相反,你希望能够直接比较两个数组,只返回一个布尔值,而不必逐一检查每个元素。
在这篇文章中,你将了解到在 JavaScript 中比较两个数组的各种方法,看看它们是否相似。
如何通过转换为字符串来比较两个数组
比较两个数组的一个常见的、相当直接的方法是,首先将这些数组转换为字符串形式。
有两种不同的方法可以使用:你可以决定使用 JSON.stringify()
方法将你的数组转换成 JSON 文本,或者你可以使用 .toString()
方法将你的数组作为一个字符串返回。
注意:这两种方法是不同的,你可以在下面看到。
let array = [11, 22, 33];
console.log(JSON.stringify(array)); //"[11,22,33]"
console.log(array.toString()); //"11,22,33"
方法 1:如何使用 JSON.stringify()
这个方法允许你通过将数组转换为 JSON 字符串来序列化每个数组。然后你可以比较这两个 JSON 字符串。
let array1 = [11, 22, 33];
let array2 = [11, 22, 33];
console.log(JSON.stringify(array1) === JSON.stringify(array2)); //true
我们也可以决定创建一个可重复使用的函数,帮助我们比较传入它的任何两个数组:
const compareArrays = (a, b) => {
return JSON.stringify(a) === JSON.stringify(b);
};
let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];
console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
方法 2:如何使用 .toString()
和 JSON.stringify()
类似,这个方法可以将任何数据类型转换为字符串,同样也可以将一个对象转换为字符串。
let array1 = [11, 22, 33];
let array2 = [11, 22, 33];
console.log(array1.toString() === array2.toString()); //true
你也可以决定创建一个可重复使用的函数,帮助你比较传入它的任何两个数组:
const compareArrays = (a, b) => {
return a.toString() === b.toString();
};
let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];
console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
注意:你应该使用 JSON.stringify()
方法,因为它只是将你的 JavaScript 数组序列化。数组仍然是数组的形式,但它只是被解析成数组的字符串版本。
如何通过剪切它们的值来比较两个数组
上面的方法在某些情况下是不够的。例如,当一个数组的值为 null
而另一个数组的值为 undefined
时,当我们使用严格比较时,我们默认得到的是 false
——这是正确的。
console.log(null === undefined); //false
但当我们使用 JSON.Strigify()
或 .toString()
方法时,会得到 true
,这不应该是这种情况。
let array1 = [11, null, 33];
let array2 = [11, undefined, 33];
console.log(JSON.stringify(array1) === JSON.stringify(array2)); //true
console.log(array1.toString() === array2.toString()); //true
一个更好的方法是比较数组的长度,然后循环比较数组的每个元素。
方法 1:使用 every()
every()
方法帮助你为数组的每个元素执行一个函数。这个函数被称为回调函数。它可以访问一些基本参数,如元素、索引等,我们可以在该函数中使用这些参数。
// 语法
array.every((currentValue, index, arr)=> { ... })
在这个方法中,我们首先要测试两个数组的长度是否可以比较。然后,我们将遍历一个数组,并使用其索引将其元素与第二个数组中的元素进行比较。
const compareArrays = (a, b) =>
a.length === b.length &&
a.every((element, index) => element === b[index]);
let array1 = [11, 22, 33];
let array2 = [21, 22, 23];
let array3 = [11, 22, 33];
console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //true
而当我们把 null
和 undefined
作为数组元素的一部分时,它将能够检测到它们是不一样的:
const compareArrays = (a, b) =>
a.length === b.length && a.every((element, index) => element === b[index]);
let array1 = [11, null, 33];
let array2 = [21, 22, 23];
let array3 = [11, undefined, 33];
console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //false
方法 2:使用 for 循环
every()
方法有一个更好的语法。不过,我们实现该方法的另一种方式是使用其他迭代方法,如 for
循环、forEach()
或 map()
与 if
语句一起使用。这些方法对于新手来说,可能更容易掌握。
const compareArrays = (a, b) => {
if (a.length !== b.length) return false;
else {
// 比较数组的各个元素
for (var i = 0; i < a.length; i++) {
if (a[i] !== b[i]) {
return false;
}
}
return true;
}
};
let array1 = [21, null, 33];
let array2 = [21, 22, 23];
let array3 = [21, undefined, 33];
let array4 = [21, 22, 23];
console.log(compareArrays(array1, array2)); //false
console.log(compareArrays(array1, array3)); //false
console.log(compareArrays(array2, array4)); //true
在上面两个方法中,首先要检查长度,因为如果长度不相等,就自动意味着两个数组不相等,然后返回 false
。
如果长度相等,那么我们就开始检查每个元素。只要两个数组中相同索引上的两个元素不一样,它就会返回 false
。
总结
这篇文章教你如何用两种主要方法在 JavaScript 中比较两个数组。
这些方法是在比较之前将数组转换为字符串,或者你可以通过循环来检查它们的值是否相似,以进行更详细的比较。
注意:两个等号检查两个值是否相等,而三个等号则检查两个值及其数据类型是否相等。你可以在这里阅读更多关于这两种类型的相等。
祝你编码愉快!