Javascript 实物比较报告
javascript中是否有内置函数(或共享开源函数的人)来比较两个对象?然后得到一份报告,说明添加了什么、删除了什么,以及哪些键的值发生了更改 例如,基本示例:(我的真实案例有更多嵌套/复杂的对象) 因此,比较o2和o1: 我希望输出像这样:Javascript 实物比较报告,javascript,object,compare,Javascript,Object,Compare,javascript中是否有内置函数(或共享开源函数的人)来比较两个对象?然后得到一份报告,说明添加了什么、删除了什么,以及哪些键的值发生了更改 例如,基本示例:(我的真实案例有更多嵌套/复杂的对象) 因此,比较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:n
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}}}
或者可以返回三个对象
var keysAdded = ['d', 'z.b']
var keysRemoved = ['a'];
var keyValPairOfChanges = {b:{was:false,is_now:true}, 'z.a':{was:false,is_now:true}}
有什么想法吗?
谢谢 这可能会让你开始 警告:这依赖于一个固有危险的递归函数 注意:这不包括对象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>
非常感谢这个精彩的开始!:)附言:哈哈哈,在一些虚拟的话:PYou是非常受欢迎的!祝你好运,这似乎是一个非常棘手的问题
<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
}
}
}
}