javascript 有没有办法检查两个数组是否具有相同的元素?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/29648234/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Is there a way to check if two arrays have the same elements?
提问by cytsunny
Let say I have 2 arrays
假设我有 2 个数组
firstArray = [1, 2, 3, 4, 5];
secondArray = [5, 4, 3, 2, 1];
I want to know if they contain the same elements, while order is not important. I know I can write a function to sort them and then loop through them to check, but is there a pre-built function for this? (not only Vanilla JS, other javascript library is also okay)
我想知道它们是否包含相同的元素,而顺序并不重要。我知道我可以编写一个函数来对它们进行排序,然后循环检查它们,但是是否有一个预建的函数呢?(不仅是Vanilla JS,其他javascript 库也可以)
采纳答案by Matt D. Webb
Using jQuery
使用 jQuery
You can compare the two arrays using jQuery
:
您可以使用jQuery
以下方法比较两个数组:
// example arrays:
var firstArray = [ 1, 2, 3, 4, 5 ];
var secondArray = [ 5, 4, 3, 2, 1 ];
// compare arrays:
var isSameSet = function( arr1, arr2 ) {
return $( arr1 ).not( arr2 ).length === 0 && $( arr2 ).not( arr1 ).length === 0;
}
// get comparison result as boolean:
var result = isSameSet( firstArray, secondArray );
Here is a JsFiddle Demo
这是一个JsFiddle 演示
See this question helpful answer
看到这个问题有帮助的答案
回答by Siguza
Well there is an Array.sort()
method in JavaScript, and for comparing the (sorted) arrays, I think it's best to check out this question, as it is has a really good answer.
好吧Array.sort()
,JavaScript 中有一种方法,为了比较(排序的)数组,我认为最好查看这个问题,因为它有一个非常好的答案。
Especially note that comparing arrays as strings (e.g. by JSON.stringify
) is a very badidea, as values like "2,3"
might break such a check.
特别要注意,将数组作为字符串(例如 by JSON.stringify
)进行比较是一个非常糟糕的主意,因为像"2,3"
这样的值可能会破坏这样的检查。
回答by shmuli
Here's a working implementation using Vanilla JS:
这是使用 Vanilla JS 的工作实现:
function haveMatchingElements(firstArray, secondArray) {
var stringsInFirstArray = parse(firstArray, 'string'),
stringsInSecondArray = parse(secondArray, 'string'),
numbersInFirstArray = parse(firstArray, 'number'),
numbersInSecondArray = parse(secondArray, 'number'),
stringResults = compare(stringsInFirstArray, stringsInSecondArray),
numberResults = compare(numbersInFirstArray, numbersInSecondArray);
if (stringResults && numberResults) {
return true;
} return false;
function parse(array, type) {
var arr = [];
arr = array.sort().filter(function(index) {
if (typeof index == type)
return index;
});
return arr;
}
function compare(firstArray, secondArray) {
if (firstArray.length !== secondArray.length)
return false;
for (var i = firstArray.length; i--;) {
if (firstArray[i] !== secondArray[i])
return false;
}
return true;
}
}
This parses strings an numbers into different arrays and checks them separately. That will correct the issue of 1
and "1"
matching as true
due to the implicit type conversion caused by the sort
function.
这将字符串和数字解析为不同的数组并分别检查它们。这将纠正由于函数引起的隐式类型转换而导致的1
和"1"
匹配问题。true
sort
The implementation is simple:
实现很简单:
var arr1 = ['1', 1];
var arr2 = [1, '1'];
var results = haveMatchingElements(arr1, arr2);
console.log(results); // true
回答by Sam4Code
Not in Vanila Javascript but in Angular there is option to match two objects.
不是在 Vanila Javascript 中,但在 Angular 中有匹配两个对象的选项。
angular.equals([1,2,3],[1,2,3])
Determines if two objects or two values are equivalent. Supports value types, regular expressions, arrays and objects.
确定两个对象或两个值是否等效。支持值类型、正则表达式、数组和对象。
See if this could help you.
看看这能不能帮到你。
alert("Match result of [1,2,3] & [1,2,3] is "+angular.equals([1,2,3],[1,2,3]));
alert("Match result of [1,4,3] & [1,2,3] is "+angular.equals([1,4,3],[1,2,3]));
<script src="https://ajax.googleapis.com/ajax/libs/angularjs/1.2.23/angular.min.js"></script>
Click on Run Code snippet. If this solves your need please mark it as as Answer :)
单击运行代码片段。如果这解决了您的需求,请将其标记为答案:)
In case order is not important and array is of number type.
如果顺序不重要并且数组是数字类型。
var a1 = [1, 2, 3];
var a2 = [2, 1, 3];
//In case order is not important and array is of number type.
alert(eval(JSON.stringify(a1).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")) === eval(JSON.stringify(a2).replace(/,/g, "+").replace(/\[/g, "").replace(/\]/g, "")));