javascript - 对象比较报告

标签 javascript object compare

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/

相关文章:

.NET 类型转换对象

java - 按索引比较 List<Integer>

python - 如何在Python中根据键和值合并两个字典?

javascript - $.递延 : How to detect when every promise has been executed

javascript - 添加动态原始数据时如何向具有相同 id 的多个下拉列表添加选项

javascript - 使用 Javascript 获取支持 bean 值

javascript - 比较、添加、更新、删除 mongodb 数组上的元素

javascript - 如何使用 javascript 将 textarea 转换为显示其他内容(例如 base64 解密)?

C#.NET : How do I create a new instance of a class based solely on a "Type" object?

javascript - 如何销毁 JavaScript 对象?