Javascript - 比较对象并在新对象中存储差异

标签 javascript object properties compare

我将给出我的两个对象的简化版本,其中包含嵌套对象:

对象 1:

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

对象 2:

{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。效率在这里非常重要。

最佳答案

只需遍历对象键并将它们与另一个对象进行比较。由于可能存在嵌套对象,因此需要递归:

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

注意:如果嵌套对象相同,则它们的差异将是一个空对象,这是合乎逻辑的。

关于Javascript - 比较对象并在新对象中存储差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52030564/

相关文章:

javascript - Firebase JS - getToken() 不返回 token

javascript - Promise 的极其简单的实现是如何工作的

javascript - 有没有办法让我的表格/图像在此代码笔中居中?

java - getResourceAsStream 在 Mac OSX 和 Windows 7 上的工作方式不同?

javascript - 如何使用 WebGL 着色器切割对象?

c# - 保护客户的 VS2015 解决方案

javascript - 在 JavaScript 函数中更改数组会更改函数外的数组?

高阶函数中的 Javascript 对象克隆

javascript - 类中是否定义了 GET 或 SET

ios - 为什么要使用@synthesize 语句