javascript - 返回两个嵌套对象之间的差异

标签 javascript

我有两个对象,我想编写一个返回对象的方法(或者更好地找到一个库),这是这两个对象之间的区别,因此具有:

const sourceObject = {
  name: 'John Doe',
  address: {
    city: 'Zurich',
    registered_date: '2018-08-10',
    residents: [
      { id: 1, name: 'Amanda', phones: ['500600500', '500400300'] },
      { id: 2, name: 'Travis', phones: [] },
    ],
  },
  partner: {
    name: 'Clara Doe',
  },
  interests: ['valleys', 'oceans', 'hawaii'],
  phone_model: 'iPhone X',
};

const compareToObject = {
  name: 'John Doe-Manny',
  address: {
    city: 'Zurich',
    registered_date: '2019-08-10',
    residents: [
      { id: 1, name: 'Amanda', phones: ['500400300', '100200300'] },
    ],
  },
  partner: undefined,
  interests: ['valleys'],
  phone_model: undefined,
};

我会得到这样的结果:

const expectedResult = {
  name: 'John Doe-Manny',
  address: {
    registered_date: '2019-08-10',
    residents: [
      { id: 1, phones: ['500400300', '100200300'] },
      { id: 2, deleted: true }, // See how deleted objects are handled
    ],
  },
  partner: undefined,
  phone_model: undefined,
};

我正在尝试找出一种方法来做到这一点,或者找到一个图书馆,但我从未如此失败过。我讨厌递归。

最佳答案

我发现这个问题很有趣,所以我想尝试一下。不幸的是,我现在不能再花时间了,所以也许其他人可以完成剩下的工作。 :-)

const sourceObject = {
  name: 'John Doe',
  address: {
    city: 'Zurich',
    registered_date: '2018-08-10',
    residents: [
      { id: 1, name: 'Amanda', phones: ['500600500', '500400300'] },
      { id: 2, name: 'Travis', phones: [] },
    ],
  },
  partner: {
    name: 'Clara Doe',
  },
  interests: ['valleys', 'oceans', 'hawaii'],
  phone_model: 'iPhone X',
};

const compareToObject = {
  name: 'John Doe-Manny',
  address: {
    city: 'Zurich',
    registered_date: '2019-08-10',
    residents: [
      { id: 1, name: 'Amanda', phones: ['500400300', '100200300'] },
    ],
  },
  partner: undefined,
  interests: ['valleys'],
  phone_model: undefined,
};


var symb = 2039432423532453;//use symbol if supported

function diff(source, comp){
    if(! ['object', 'array'].includes(typeof(comp))){
        if(source !== comp){
            return comp;
        }
        return symb;
    }
    var out = {};
    for(var k in comp){
        var res = diff(source[k], comp[k]);
        if(res !== symb){
            out[k] = res;
        }
    }
    if(Object.keys(out).length != 0)
      return out;
    return symb;
}

console.log(diff(sourceObject, compareToObject));

关于javascript - 返回两个嵌套对象之间的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51636385/

相关文章:

javascript - 将 setTimeout 与 window.open() 一起使用后,将 setTimeout 与 window.close() 一起使用不起作用

php - JavaScript 字符串连接

javascript - Request.Get 和异步/等待

javascript - 将变量传递给对象关键函数并返回给请求函数

javascript - 为什么 JSON 克隆对象比 `for in` 和 `map` 更快?

Javascript - 类第一次出现,多次

javascript - 添加固定参数等待回调

javascript - 使用 dataContext 在 Gantt Amcharts 中显示信息

Javascript 将 IETF 日期转换为 ISO8601 格式

javascript - 如何将 Javascript 数组发布到 C# 元组列表?