2014-11-14 51 views
1

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

这可能会让你开始。

警告:这依赖于一个递归函数,其是固有的危险

注意:这并不考虑在对象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 
     } 
     } 
    } 
} 
+0

谢谢这真是太棒了! :) ps:HAHAHAAH在一些虚拟的单词中:P – Noitidart 2014-11-15 00:20:33

+0

非常欢迎您!祝你好运,这似乎是一个非常棘手的问题 – 2014-11-15 00:23:14