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));
推荐阅读
- c# - 在类之外更改类属性值
- sql - SQL 计算限制为小数点后 6 位
- cmake - CMake/FindDoxygen:MSYS2 中的路径处理
- android - 没有为“StorageUploadTask”类型定义吸气剂“未来”
- html - 我需要 Css 中 flex:1 的帮助
- python - 如何修复 Anaconda 上没有名为“PolynomialRegression”的模块?
- javascript - 获取烧瓶返回语句javascript
- c# - WPF 自定义控件:ViewBox 上的 HorizontalAlignment 样式设置未正确初始化
- react-native - 新手在这里... Firebase 和 AsyncStorage 问题
- java - ArrayList 递归行为