对象比较报告

时间:2014-11-14 22:56:34

标签: 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}}

任何想法? 谢谢!

1 个答案:

答案 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
         }
      }
   }
}