views:

3062

answers:

2

Hi, I have searched on here for a quality method to compare associative arrays in javascript. The only decent solution I have found is the PHP.JS project which has some comparative array functions. The only problem is that these functions consider the first array as the key to the second. In my situation at least both arrays do not always have the same # of keys nor the same keys. This causes the functions to output results that do not include keys that may not have existed in array1 but existed in array2. The only thing I can think of so far is to run the array_diff_associative() function twice with the arguments flipped and then combine them(which seems problematic since the first argument again is used as the keys to the second).

Any suggestions? Thank you.

+3  A: 

I think the following should do what you want:

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;
}
Dean Povey
just wondering, shouldn't your first comparison in compareAssociativeArrays be if (a === b) ?
David Archer
err yes probably :-)
Dean Povey
+1  A: 

I really don't know if there is a nicer way to do it than the brute force approach:

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

Also, they are objects, not arrays, and some properties will not be enumerable through for..in (like Array.length, for example), so take it into account for your application.

Victor