比较两个数组的元素

6

我有两个JavaScript数组,需要进行比较。例如,假设我有以下这两个数组:

var array1 = ["1", "2", "3", "4"];
var array2 = ["4", "1", "3", "2"];

这些数组实际上是相等的,我希望将它们进行比较时得到true作为结果。有什么最好和最快的方法来完成这个操作吗?


1
你的数组可以有重复的值吗? - Vaibhav
是的,也许它们具有某些重复值。 - hamed
1
我真诚地希望下面的踩来自于你,楼主。 - Passerby
不,我没有对任何答案进行点踩。 - hamed
嗯,那么普通的索引检查将不起作用,我们需要知道一个数字重复的次数。我在我的解决方案中捕获了这个信息,时间复杂度为O(n),空间复杂度也是O(n)。 - Vaibhav
@TechnoCrat.. OP的问题是关于JavaScript的,而JavaScript中没有任何列表概念和containsAll方法。您也可以在相关标签中看到这一点 :) - Arkantos
5个回答

4
你实际上拥有的是两个“集合”,而不是数组,但不幸的是JavaScript没有提供任何类型的“集合”数据类型。这种类型的检查最简单的方法是使用某种函数式JavaScript库,比如lodash。
使用lodash的_.union函数可以轻松解决这个问题。
function setsEqual(a, b) {
  var u = _.union(a, b);
  return u.length === a.length && u.length === b.length;
}

如果您不想使用外部库,可以使用Array.prototype.every来实现。该方法可用于编程相关内容。请注意保留HTML标签。
function setsEqual(a, b) {
  return a.length === b.length
      && a.every(function (v) { return b.indexOf(v) !== -1; });
}

在Js获得一些新的函数来快速完成此操作之前,这是您可以完成它的最快方式。 - Alberto Perez

2

最好和最快的方法是使用对象来跟踪值及其计数。然后我们可以查看它是否存在于第二个数组中。试试这个:

function compare(arr1, arr2){
    var obj={}, len = arr1.length, i=0, isSame=true, prop;
    if(arr1.length === arr2.length){
        for(;i<len;i++){
            if(obj[arr1[i]]){
                obj[arr1[i]] = obj[arr1[i]]+1;
            } else{
                obj[arr1[i]] =1;
            }
        }
        i=0, len = arr2.length;
        for(;i<len;i++){
            if(obj[arr2[i]]){
                obj[arr2[i]] = obj[arr2[i]]-1;
            } else{
                isSame = false;
                break;
            }
        }
        for (prop in obj){
            if(obj[prop] > 0){
                isSame = false;
                break;
            }
        }
    }else{
        isSame = false;
    }
    return isSame;

}

0

在比较两个数组后,从函数返回状态。

arr1 = [101,12,13,10,4];
arr2 = [101,4,12,13,10];


function compareTwoArray(arr1, arr2) {
  return arr1.length === arr2.length && 
  arr1.sort().every((val, index)=> val === arr2.sort()[index]);
}  
console.log(compareTwoArray(arr1, arr2))


0

尝试移除匹配的元素,直到两个元素都为空:

var array1 = ["1", "2", "3", "4", "1", "5"];
var array2 = ["1", "5", "2", "3", "4", "1"];
var isSame = false;
if(array1.length != array2.length)
    isSame = false;
else
{
    for(var i = 0; i < array1.length; i ++)
    {
        var removed = false;
        for(var j = 0; j < array2.length; j ++)
        {
            if(array2[j] == array1[i])
            {
                //  remove from array2
                array1.splice(i, 1);
                //  remove from array1
                array2.splice(j, 1);
                //  go back 1 for i
                removed = true;
                i --;
                break;
            }
        }
        if(!removed)
            break;
}

    if(array1.length == 0 && array2.length == 0)
        isSame = true;
}

0

我不认为这是最快的方法,但对于一些基本数组可能会有用

function compareArrays(a, b) {
  var copyA = a.slice(),
      copyB = b.slice();

  if (a.length !== b.length) { return false; }
  return copyA.sort().toString() === copyB.sort().toString();

}


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接