javascript - 比较 JavaScript 中的嵌套对象并返回键相等
问题描述
我有两个嵌套对象obj1
,obj2
我想比较它们并递归返回一个对象,该对象对于每个嵌套键都有一个类似相等的布尔标志
所以对于给定的obj1
喜欢
obj1 = {
prop1: 1,
prop2: "foo",
prop3: {
prop4: 2,
prop5: "bar"
}
}
之obj2
类的
obj2 = {
prop1: 3,
prop2: "foo",
prop3: {
prop4: 2,
prop5: "foobar"
},
prop6: "new"
}
它应该返回
equality = {
prop1: false,
prop2: true,
prop3 : {
prop4: true,
prop5: false
},
prop6: false
}
如果一个对象有一个新的属性,比如obj2.prop6
,那么相等性就是equality.prop6 = false
。
对于非嵌套对象,这里有一个简单的键比较解决方案在 javascript 中获取两个对象之间差异的属性 而递归比较嵌套对象,这里显示JavaScript:递归深度比较:对象和属性
解决方案
如果两个值都是对象,您可以迭代所有键并检查嵌套对象。
const isObject = v => v && typeof v === 'object';
function getDifference(a, b) {
return Object.assign(...Array.from(
new Set([...Object.keys(a), ...Object.keys(b)]),
k => ({ [k]: isObject(a[k]) && isObject(b[k])
? getDifference(a[k], b[k])
: a[k] === b[k]
})
));
}
var obj1 = { prop1: 1, prop2: "foo", prop3: { prop4: 2, prop5: "bar" } },
obj2 = { prop1: 3, prop2: "foo", prop3: { prop4: 2, prop5: "foobar" }, prop6: "new" };
console.log(getDifference(obj1, obj2));
推荐阅读
- amazon-web-services - 是否可以将 AWS API 网关 API 密钥存储在秘密管理器中并轮换它们
- c++ - char* 和带有 std::getenv 的字符串之间的意外差异
- php - 为每个类别创建视图 - laravel
- javascript - 为什么当我尝试将字符串添加到我的数组位置时不起作用
- java - 从 if 语句的第一部分返回后的 else
- python - 在python中停止子进程
- javascript - 将隐藏 ID 附加到动态创建的 DIV
- c++ - 旅行推销员分而治之 C++
- node.js - TypeError:无法读取未定义的属性“RichEmbed”
- python - 我无法使用 Python 将名称中包含空格的文件上传到 Google Cloud Storage。我究竟做错了什么?