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

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-28 10:50:17  来源:igfitidea点击:

Is there a way to check if two arrays have the same elements?

javascriptarrays

提问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 1and "1"matching as truedue to the implicit type conversion caused by the sortfunction.

这将字符串和数字解析为不同的数组并分别检查它们。这将纠正由于函数引起的隐式类型转换而导致的1"1"匹配问题。truesort

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, "")));