对象比较报告

Report of object comparison

本文关键字:报告 比较 对象      更新时间:2023-09-26

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