检查两个数组之间的相等性[重复]
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.stringify
和 Array#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 这就是长度检查的用途。如果两个数组的长度相同,则迭代一个并匹配另一个数组中的相应值将得到相同的结果。以上是关于检查两个数组之间的相等性[重复]的主要内容,如果未能解决你的问题,请参考以下文章