有没有办法检查两个数组是否具有相同的元素?

时间:2015-04-15 10:48:39

标签: javascript arrays

假设我有2个阵列

firstArray  = [1, 2, 3, 4, 5];
secondArray = [5, 4, 3, 2, 1];

我想知道它们是否包含相同的元素,而顺序并不重要。我知道我可以编写一个函数来对它们进行排序,然后循环遍历它们进行检查,但是有没有预先构建的函数呢? (不仅是Vanilla JS,其他javascript库也没关系)

5 个答案:

答案 0 :(得分:4)

使用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 );

这是JsFiddle Demo

请参阅此问题helpful answer

答案 1 :(得分:1)

在JavaScript中有一个Array.sort()方法,并且为了比较(排序)数组,我认为最好查看this question,因为它有一个非常好的答案。

特别注意,将数组作为字符串进行比较(例如,通过JSON.stringify)是一个非常糟糕的主意,因为像"2,3"这样的值可能会破坏这样的检查。

答案 2 :(得分:0)

这是使用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;
    }
}

将字符串解析为不同的数组并分别检查它们。由于1函数导致的隐式类型转换,这将更正"1"true匹配为sort的问题。

实施很简单:

var arr1 = ['1', 1];
var arr2 = [1, '1'];

var results = haveMatchingElements(arr1, arr2);
console.log(results); // true  

答案 3 :(得分:0)

使用原生 JavaScript

支持您可以使用的所有现代浏览器Array.prototype.every()

ECMAScript 2016

let firstArray  = [1, 2, 3, 4, 5];
let secondArray = [5, 4, 3, 2, 1];
let Equals = firstArray.every((item)=>secondArray.includes(item))
alert("Equals? " + Equals)

Internet Explorer 支持

Internet Explorer 无权访问 Array.prototype.includes()。如果您需要它在 Internet Explorer 中运行,您可以使用 indexOf

let firstArray  = [1, 2, 3, 4, 5];
let secondArray = [5, 4, 3, 2, 1];
let Equals = firstArray.every(function (item){return secondArray.indexOf(item) > -1})
alert("Equals? " + Equals)

这将遍历 firstArray 中的每一项并检查该值是否包含在 secondArray 中,并且仅当函数为 Every item 返回 true 时才返回 true

请注意,给定的函数适用于这个问题,但它是非递归的,仅适用于两个平面数组上的原始类型,如果要比较非原始类型,则需要将比较函数修改为比较你的对象结构

答案 4 :(得分:-1)

不是在Vanila Javascript中,但在Angular中,可以选择匹配两个对象。

angular.equals([1,2,3],[1,2,3])

确定两个对象或两个值是否相等。支持值类型,正则表达式,数组和对象。

看看这对你有帮助。

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>

单击“运行代码”片段。如果这解决了您的需要,请将其标记为答案:)

如果顺序不重要且数组是数字类型。

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