原文: 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

而当我们把 nullundefined 作为数组元素的一部分时,它将能够检测到它们是不一样的:

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 中比较两个数组。

这些方法是在比较之前将数组转换为字符串,或者你可以通过循环来检查它们的值是否相似,以进行更详细的比较。

注意:两个等号检查两个值是否相等,而三个等号则检查两个值及其数据类型是否相等。你可以在这里阅读更多关于这两种类型的相等。

祝你编码愉快!