Вопрос по associative, javascript, comparison, arrays – Сравните два массива Javascript - ассоциативный

8

Я искал здесь качественный метод для сравнения ассоциативных массивов в JavaScript. Единственное достойное решение, которое я нашел, этоPHP.JS проект, который имеет некоторые функции сравнительного массива. Единственная проблема состоит в том, что эти функции рассматривают первый массив как ключ ко второму. В моей ситуации, по крайней мере, оба массива не всегда имеют одинаковое количество клавиш или одинаковые ключи. Это заставляет функции выводить результаты, которые не включают ключи, которые, возможно, не существовали в array1, но существовали в array2. Пока я могу думать только о том, чтобы дважды запустить функцию array_diff_associative () с перевернутыми аргументами, а затем объединить их (что кажется проблематичным, поскольку первый аргумент снова используется в качестве ключей ко второму).

Какие-либо предложения? Спасибо.

Ваш Ответ

3   ответа
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;
}
ошибся да наверное :-)
просто интересно, не должно ли быть ваше первое сравнение в CompareAssociativeArrays if (a === b)?
Одним из недостатков сообщается, чтоtoString() does not work in Netscape 2 and Explorer 3
Я обновил эту функцию:gist.github.com/skylord123/e595f97516e979c40905657527844c46  Может быть полезным для некоторых, несмотря на то, что этот вопрос действительно очень стар.
Ваше решение имеет два недостатка: (1) оно будет неправильно возвращать true в случае, когда a и b имеют одинаковые размеры, и a имеет ключ, который указывает на неопределенное значение, в то время как b не имеет этого ключа. (2) он неверно возвратил бы false в случае, когда внутри a и b существуют два значения, которые имеют одинаковые значения, но на самом деле являются объектами и не равны a & apos; == & apos; оператор. Хотя это легко исправить (1), потребуется больше усилий для исправления (2). В качестве альтернативного решения я бы использовал толькоtoString()или даже быстрее,join('') метод для сравнения двух строк.
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), поэтому учитывайте это для своего приложения.

8

Это старый вопрос, но, поскольку он в первую очередь подходит для поиска в Google для сравнения массивов, я подумал, что добавлю альтернативное решение, которое работает, даже если массив имеет два разных объекта с одинаковыми значениями.

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

Примечание. Это зависит от порядка, поэтому, если порядок не имеет значения, вы всегда можете выполнить сортировку заранее.

Похожие вопросы