JavaScript 中是否有内置函数(或共享开源函数的人)来比较两个对象?并获得一份报告,说明添加了什么、删除了什么以及哪些键的值发生了更改?
对于基本示例:(我的真实案例有更多嵌套/复杂的对象)
var o1 = {a: true, b: false, c: false, z: {a:false}}
var o2 = {b:'hi', c:false, d: 5, z:{a:true,b:false}}
比较 o2 和 o1:
我希望输出像这样:
var changes = {a:{was:true,is_now:null}, b:{was:false,is_now:'hi'}, d:{was:null,is_now:5},z:{a:{was:false,is_now:true},b:{was:null,is_now:false}}}
OR 可以返回三个对象。
var keysAdded = ['d', 'z.b']
var keysRemoved = ['a'];
var keyValPairOfChanges = {b:{was:false,is_now:true}, 'z.a':{was:false,is_now:true}}
有什么想法吗? 谢谢!
最佳答案
这可能会帮助您入门。
Warning: this relies on a recursive function which is inherently dangerous
注意:这不考虑对象 2 中对象 1 中不存在的新键。
<script>
var o = {
a : 'boo',
b : 'loo',
c : 'noo',
d : 'fa',
e : 'da',
f : 'la',
g : {
a : 'woo',
b : 'loo'
},
h : {
a : {
a : false
},
b : {
d : false
}
}
}
var o2 = {
a : 'boom',
b : 'loom',
c : 'noo',
d : 'fad',
e : 'dad',
f : 'lad',
g : {
a : 'woom',
b : 'loo'
},
h : {
a : {},
},
g : false
}
function compare(o1, o2) {
function get_diff(ob1, ob2, k) {
var diff = {};
k = k || '';
for (var key in ob1) {
k = k + key;
if (typeof ob2 !== 'undefined' && typeof ob2 == 'object') {
if (typeof ob1[key] == "object") {
var t = get_diff(ob1[key], ob2[key], k);
if (t) {
diff[key] = t;
}
} else {
if (ob1[key] !== ob2[key]) {
diff[key] = { was : ob1[key], now : ob2[key] };
}
}
} else {
if (typeof ob2 == 'undefined') {
diff[key] = {was : ob1[key], now : undefined};
} else {
diff[key] = {was : ob1[key], now : ob2};
}
}
}
return diff;
}
return get_diff(o1, o2);
}
console.log(compare(o, o2));
</script>
输出:
{
"a":{
"was":"boo",
"now":"boom"
},
"b":{
"was":"loo",
"now":"loom"
},
"d":{
"was":"fa",
"now":"fad"
},
"e":{
"was":"da",
"now":"dad"
},
"f":{
"was":"la",
"now":"lad"
},
"g":{
"a":{
"was":"poo",
"now":false
},
"b":{
"was":"loo",
"now":false
}
},
"h":{
"a":{
"a":{
"was":false,
"now":undefined
}
},
"b":{
"d":{
"was":false
"now":undefined
}
}
}
}
关于javascript - 对象比较报告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26940221/