9

我在这里搜索了一种质量方法来比较 javascript 中的关联数组。我发现的唯一不错的解决方案是PHP.JS项目,它有一些比较数组函数。唯一的问题是这些函数将第一个数组视为第二个数组的键。在我的情况下,至少两个数组并不总是具有相同的键数或相同的键。这会导致函数输出的结果不包括可能不存在于 array1 但存在于 array2 中的键。到目前为止,我唯一能想到的就是在翻转参数的情况下运行 array_diff_associative() 函数两次,然后将它们组合起来(这似乎有问题,因为第一个参数再次用作第二个参数的键)。

有什么建议么?谢谢你。

4

3 回答 3

10

这是一个老问题,但由于它首先出现在谷歌搜索比较数组中,我想我会提出一个替代解决方案,即使数组有两个具有相同值的不同对象。

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

注意:这取决于顺序,所以如果顺序无关紧要,您总是可以提前进行排序。

于 2014-12-11T19:51:21.833 回答
7

我认为以下应该做你想要的:

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;
}
于 2009-07-10T02:59:05.607 回答
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;
}

此外,它们是对象,而不是数组,并且某些属性将无法通过 for..in 枚举(例如 Array.length),因此请在您的应用程序中考虑它。

于 2009-07-10T10:35:56.553 回答