Как найти различия между двумя массивами JavaScript объектов?
У меня есть два массива JavaScript orig
(исходный массив объектов) и update
(обновленный массив объектов), которые имеют одинаковую длину и содержат объекты, и я хочу вывести различия между каждой парой объектов.
Пример:
var orig = [{enabled:"true", name:"Obj1", id:3},{enabled:"true", name:"Obj2", id:4}];
var update = [{enabled:"true", name:"Obj1", id:3}, {enabled:"true", name:"Obj2-updated", id:4}];
Выход должен быть: name:"Obj2-updated"
Я реализовал что-то, но ему нужна оптимизация...
for(var prop=0; prop<orig.length; prop++) {
for(prop=0; prop<update.length; prop++) {
if(orig[prop].enabled != update.enabled) { console.log(update.enabled) }
if(orig[prop].name != update[prop].name) { console.log(update[prop].name) }
if(orig[prop].id != update[prop].id) { console.log(update[prop].id) }
}
}
Ответы
Ответ 1
Вы можете отфильтровать ключи и получить набор результатов с обновленными ключами.
var orig = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2", id: 4 }],
update = [{ enabled: "true", name: "Obj1", id: 3 }, { enabled: "true", name: "Obj2-updated", id: 4 }],
difference = [];
orig.forEach(function (a, i) {
Object.keys(a).forEach(function (k) {
if (a[k] !== update[i][k]) {
difference.push({ id: update[i].id, key: k, value: update[i][k], index: i });
}
});
});
console.log(difference);
Ответ 2
Предполагая, что имена свойств обоих одинаковы, а значения являются просто примитивами (без объектов, массивов и т.д.):
Object.keys( orig )
.forEach( (key) => {
if( orig[ key ] !== update[ key ] ) {
console.log( update[key] );
}
});
Ответ 3
Используйте Object.keys
для перемещения по объекту. Что-то вроде:
var orig = {
enabled: "true",
name: "Obj1",
id: 3
};
var update = {
enabled: "true",
name: "Obj1-updated",
id: 3
};
var diff = {};
Object.keys(orig).forEach(function(key) {
if (orig[key] != update[key]) {
diff[key] = update[key];
};
})
console.log(diff);
Ответ 4
Вы можете использовать один цикл для проверки свойств исходного объекта и проверки на обновленный объект, чтобы узнать, какие свойства были изменены.
var orig = {
enabled: "true",
name: "Obj1",
id: 3
};
var update = {
enabled: "true",
name: "Obj1-updated",
id: 3
};
for (var key in orig) {
if (orig[key] !== update[key]) {
console.log(key + ': ' + update[key]);
}
}
Ответ 5
Вы можете использовать библиотеку, такую как lodash или Ramda, чтобы сделать это в сжатой манере. В случае с Рамдой вы можете сделать:
R.difference(update, orig);