Javascript - сравнивать объекты и хранить различия в новом объекте - PullRequest
0 голосов
/ 27 августа 2018

Я приведу упрощенную версию двух моих объектов с вложенными объектами внутри них:

Object1:

{firstname: 'John', lastname: 'Cena', privateInfo: {privateProperty1: false, privateProperty2: true}}

Object2:

{firstname: 'John', middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true, privateProperty2: true} }

После сравнения Object1в Object2, я хочу сохранить все различные свойства, которые Object2 имеет в новом объекте.В моем случае это будет:

let Object3 = {middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true}}

Каков наилучший и наиболее эффективный способ сравнения всех свойств этих объектов (включая вложенные и отсутствующие)?

В моем случае свойства объекта могут достигать 30-40.Эффективность здесь очень важна.

1 Ответ

0 голосов
/ 27 августа 2018

Просто зациклите ключи объекта и сравните их с другим объектом.Поскольку может быть вложенный объект, необходима рекурсия:

function difference(object, other) {
  var diff = {};
  for(var key in object) {
    if(typeof object[key] === "object" && typeof other[key] === "object" && object[key] && other[key]) {
      diff[key] = difference(object[key], other[key]);
    } else if(object[key] !== other[key]) {
      diff[key] = object[key];
    }
  }
  return diff;
}

Пример:

function difference(object, other) {
  var diff = {};
  for(var key in object) {
    if(typeof object[key] === "object" && typeof other[key] === "object" && object[key] && other[key]) {
      diff[key] = difference(object[key], other[key]);
    } else if(object[key] !== other[key]) {
      diff[key] = object[key];
    }
  }
  return diff;
}

var object1 = {firstname: 'John', lastname: 'Cena', privateInfo: {privateProperty1: false, privateProperty2: true}};
var object2 = {firstname: 'John', middlename: 'Felix', lastname: 'Pina', privateInfo: {privateProperty1: true, privateProperty2: true} };

console.log(difference(object2, object1));

Примечание: Если вложенные объекты совпадают, их различие будет пустым объектом, что логично.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...