Сравнение двух массивов Javascript - ассоциативный
Я искал здесь для качественного метода сравнения ассоциативных массивов в javascript. Единственное достойное решение, которое я нашел, это проект PHP.JS, который имеет некоторые сравнительные функции массива. Единственная проблема заключается в том, что эти функции рассматривают первый массив как ключ ко второму. В моей ситуации, по крайней мере, оба массива не всегда имеют одинаковые клавиши или одни и те же клавиши. Это заставляет функции выводить результаты, которые не содержат ключей, которые могут отсутствовать в массиве1, но существовали в массиве2. Единственное, о чем я могу думать, это запустить функцию array_diff_associative() дважды, когда аргументы перевернуты, а затем объединить их (что кажется проблематичным, поскольку первый аргумент снова используется как ключи ко второму).
Любые предложения?
Спасибо.
Ответы
Ответ 1
Это старый вопрос, но, поскольку он появляется сначала в поиске Google для сравнения массивов, я думал, что я бы выбрал альтернативное решение, которое работает, даже если у массива есть два разных объекта с одинаковыми значениями.
function arrays_equal(a, b) {
return JSON.stringify(a) == JSON.stringify(b);
}
Примечание. Это зависит от порядка, поэтому, если порядок не имеет значения, вы всегда можете сделать сортировку раньше времени.
Ответ 2
Я думаю, что следующее должно делать то, что вы хотите:
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;
}
Ответ 3
Я действительно не знаю, есть ли лучший способ сделать это, чем подход грубой силы:
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;
}
Кроме того, они являются объектами, а не массивами, а некоторые свойства не могут быть перечислимы через .in(например, Array.length, например), поэтому учтите это для вашего приложения.