【问题标题】:Report of object comparison对象比较报告
【发布时间】:2014-11-14 22:56:33
【问题描述】:

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

有什么想法吗? 谢谢!

【问题讨论】:

    标签: javascript object compare


    【解决方案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
             }
          }
       }
    }
    

    【讨论】:

    • 非常感谢这次精彩的开始! :) ps:哈哈哈哈在一些假词:P
    • 不客气!祝你好运,这似乎是一个非常棘手的问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    • 2021-05-22
    • 2013-11-01
    • 1970-01-01
    相关资源
    最近更新 更多