javascript - Javascript - 比较对象并将差异存储在新对象中
问题描述
我将给出我的两个对象的简化版本,其中包含嵌套对象:
对象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));
注意:如果嵌套对象相同,它们的区别将是一个空对象,这是合乎逻辑的。
推荐阅读
- sparql - SPARQL:返回带有多个特定类型对象的主题
- php - 使用 php date() 为 Woocommerce 转换奇怪的时间戳
- java - 无法找到或加载主类 org.apache.hadoop.mapreduce.v2.app.MRAppMaster
- vba - 如何在 excel vba 中获取嵌入对象标题?
- python - 跳过 if 条件后的第一行
- .net - 当 ServiceCertificate.Authentication.CertificateValidationMode 设置为 none 时会出现什么样的特定风险
- php - Laravel:目标在构建时不可实例化
- android - Proguard:如何保持内部@interfaces?
- c++ - 使用全局 IP 地址时,C++ winsock 2 应用程序中的代码是否必须更改?
- docker - 使用 Neo4j 和 docker-compose 配置环境变量