Javascript 实物比较报告

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

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