【问题标题】:Check for equality between two arrays [duplicate]检查两个数组之间的相等性[重复]
【发布时间】:2017-01-23 20:18:39
【问题描述】:

如何在不使用外部库(最好使用 ES5)的情况下检查两个数组元素之间的相等性?

我想检查它们之间的相等性而不关心元素的顺序。所以在我的情况下,[1,2,3][2,3,1] 这两个数组是相等的。

我想我应该写一个函数

function isEqual(arr1, arr2) {
  arr1.forEach(el => {
    if (arr2.indexOf(el) === -1) {
      return false;
    }
  });

  arr2.forEach(el => {
    if (arr1.indexOf(el) === -1) {
      return false;
    }
  });

  return true;
}

【问题讨论】:

  • 这里有很多问题,例如如果它们的长度不同并且有重复项怎么办。
  • [1,2,3][1,3,3,2] 对你也一样吗?

标签: javascript arrays


【解决方案1】:

您可以使用 JSON.stringifyArray#sort 方法。对两个数组进行排序并在转换为 JSON 字符串后进行比较。

function isEqual(arr1, arr2) {
  return JSON.stringify(arr1.sort()) === JSON.stringify(arr2.sort());
}

console.log(isEqual([1, 2, 3], [2, 3, 1]));
console.log(isEqual([1, 2, 3], [2, 4, 1]));
console.log(isEqual([1, 2, 3, 3], [2, 3, 1]));
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));

或者代替 JSON.stringify 你也可以使用 Array#join 方法(建议由 @JonCarter ) 这使它变得更简单。

function isEqual(arr1, arr2) {
  return arr1.sort().join() === arr2.sort().join();
}

console.log(isEqual([1, 2, 3], [2, 3, 1]));
console.log(isEqual([1, 2, 3], [2, 4, 1]));
console.log(isEqual([1, 2, 3, 3], [2, 3, 1]));
console.log(isEqual([1, 2, 3, 3], [2, 4, 1, 1]));

【讨论】:

  • 我喜欢这个——它简短而优雅。只是一个建议:使用 Array.join() 可能比 JSON.stringify 好一点。例如arr1.sort().join() === arr2.sort().join()
  • @JonCarter :哇,那会更好.....谢谢并根据您的建议更新了答案:)
  • 谢谢!很好的解决方案
【解决方案2】:

您可以使用Array#every 断言值相等。这是非常基本的,尽管使用严格的相等检查有其局限性。但这显示了迭代数组的粗略框架。

注意:由于数组是基于索引的列表,因此假定它们要相等,它们需要在同一索引处具有相等的值。

var arr1 = [1,2,3,4];
var arr2 = [1,2,3,4];
var arr3 = [1,2,4];
var arr4 = [1,2,2,4];

function isArrEql(a1, a2) {
  return a1.length === a2.length && a1.every(function(v, i) {
    return v === a2[i];
  });
}

console.log('arr1, arr2: ', isArrEql(arr1, arr2));
console.log('arr1, arr2: ', isArrEql(arr1, arr3));
console.log('arr1, arr2: ', isArrEql(arr1, arr4));

【讨论】:

  • 但是a1.every((v, i) => v === a2[i])a2.every((v, i) => v === a1[i]) 一样吗?我不必同时检查吗?
  • @Jamgreen 这就是长度检查的用途。如果两个数组的长度相同,则迭代一个并匹配另一个数组中的相应值将得到相同的结果。
猜你喜欢
  • 2020-05-24
  • 2013-08-30
  • 1970-01-01
  • 1970-01-01
  • 2013-02-25
  • 2019-08-29
  • 2020-02-12
  • 2020-04-29
相关资源
最近更新 更多