对象比较报告
Report of object comparison
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}}
有什么想法吗?谢谢!
这可能会让你开始。
警告:这依赖于递归函数,这本质上是危险的
注意:这不考虑对象 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
}
}
}
}
相关文章:
- 比较从函数和生成的日期对象
- 如何使用 node.js 比较两个 json 数组
- jQuery自定义验证比较多个输入的序列
- 如何通过自己获得Chrome扩展的用户反馈/错误报告
- 反向字符串比较
- 通过JSON&比较时间
- 将DOM节点值与字符串Javascript进行比较
- 从键值结构中获取数据,并将其与AngularJS中ng重复的值进行比较
- 递归深度比较
- 可以't在JavaScript中比较两个字符串
- 实现比较方法的最佳实践是什么;s的比较类型是在运行时选择的
- angularjs$valid-on-dates在firefox中报告错误
- 如何在moment.js中只比较日期
- 无法比较javascript变量
- 比较javascript中的浮动并更改最高浮动的颜色
- 使用javascript比较对象中的对象值和数组长度
- 如何将smarty变量与javascript变量进行比较
- 比较两个数组中的元素
- 表格报告-动态比较特定用户的输入日期和现有日期
- 对象比较报告