检查两个数组之间的相等性[重复]

Posted

技术标签:

【中文标题】检查两个数组之间的相等性[重复]【英文标题】: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] 对你也一样吗? 【参考方案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 这就是长度检查的用途。如果两个数组的长度相同,则迭代一个并匹配另一个数组中的相应值将得到相同的结果。

以上是关于检查两个数组之间的相等性[重复]的主要内容,如果未能解决你的问题,请参考以下文章

如何检查NaN javascript的相等性[重复]

在Java中检查三个或更多字符串的相等性[重复]

为啥相等检查不适用于数组[重复]

C ++中派生类的相等性测试[重复]

检查两个无序列表是不是相等[重复]

R:如何在 R 中的两个重复项之间包含一个字符?