比较两个Javascript数组 - 关联数组

9
我在这里搜索了一种比较javascript中关联数组的优质方法。我找到的唯一可靠的解决方案是PHP.JS项目,该项目具有一些比较数组函数。唯一的问题是这些函数认为第一个数组是第二个数组的键。至少在我的情况下,两个数组不总是具有相同数量的键或相同的键。这会导致函数输出的结果不包括可能存在于array2中但不存在于array1中的键。到目前为止,我能想到的唯一办法就是使用array_diff_associative()函数两次,参数翻转,然后将它们组合起来(这似乎有问题,因为再次使用第一个参数作为第二个参数的键)。你有什么建议吗?谢谢。
3个回答

11

这是一个旧问题,但由于它在Google搜索中首先出现用于比较数组,因此我认为我应该提供一种替代方案,即使数组有两个具有相同值的不同对象也可以工作。

function arrays_equal(a, b) {
    return JSON.stringify(a) == JSON.stringify(b);
}

注意:这是有序的,所以如果顺序不重要,你可以提前进行排序。


8
我认为以下内容可以满足您的需求:
function nrKeys(a) {
    var i = 0;
    for (key in a) {
        i++;
    }
    return i;
}
function compareAssociativeArrays(a, b) {
   if (a == b) {
       return true;
   }   
   if (nrKeys(a) != nrKeys(b)) {
       return false;
   }
   for (key in a) {     
     if (a[key] != b[key]) {
         return false;
     }
   }
   return true;
}

1
只是想知道,你在 compareAssociativeArrays 中的第一个比较不应该是 if (a === b) 吗? - Dave Archer
你的解决方案有两个缺点:(1) 当a和b具有相同的大小,且a具有指向未定义值的键而b没有该键时,它会错误地返回true。(2) 当a和b中存在两个具有相同值但实际上是对象且不通过'=='运算符相等的值时,它会错误地返回false。虽然修复(1)很容易,但修复(2)需要更多的努力。作为替代方案,我将使用只有一个**toString()或者更快的join('')**方法来比较两个字符串。 - CuongHuyTo
一个已知的问题是 toString() 不兼容 Netscape 2 和 Explorer 3 - CuongHuyTo
我已更新此函数:https://gist.github.com/skylord123/e595f97516e979c40905657527844c46尽管这个问题非常古老,但对一些人可能仍然有用。 - Skylord123

2

我真的不知道有没有比暴力方法更好的方法:

function differences(a, b){
  var dif = {};
  for(key in a){ //In a and not in b
    if(!b[key]){
      dif[key] = a[key];
    }
  }
  for(key in a){ //in a and b but different values
    if(a[key] && b[key] && a[key]!=b[key]){
      //I don't know what you want in this case...
    }
  }
  for(key in b){ //in b and not in a
    if(!a[key]){
      dif[key] = b[key];
    }
  }
  return dif;
}

此外,它们是对象而不是数组,并且一些属性(例如Array.length)不会通过for..in枚举,因此在应用程序中要考虑这一点。

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