Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
比较两个Javascript关联数组_Javascript_Arrays_Comparison_Associative - Fatal编程技术网

比较两个Javascript关联数组

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

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

有什么建议吗?
谢谢。

我认为以下几点可以满足您的要求:

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;
}

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

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),因此在应用程序中要考虑到这一点。

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

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

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

只是想知道,您的第一次比较compareAssociativeArrays是否应该是if(a==b)?您的解决方案有两个缺点:(1)当a和b的大小相同时,它会错误地返回true,a有一个指向未定义值的键,而b没有该键。(2) 如果a和b中存在两个值,它们具有相同的值,但实际上是对象,并且通过“==”运算符不相等,那么它将错误地返回false。虽然修复(1)很容易,但修复(2)需要更多的努力。作为另一种解决方案,我会使用一个toString(),甚至更快的join(“”)方法来比较两个字符串。一个被报道的缺点是,我已经更新了这个函数:尽管这个问题非常古老,但它可能对某些人有用。