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}}
任何想法? 谢谢!
答案 0 :(得分:1)
这可能会让你开始。
警告:这依赖于本身就很危险的递归函数
注意:这不会考虑对象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
}
}
}
}