合并没有新密钥的JSON对象

时间:2011-11-03 15:16:54

标签: javascript json

如何合并两个JSON对象但不包含第一个Object中不存在的属性?

输入

var obj1 = { x:'', y:{ a:'', b:'' } };
var obj2 = { x:1, y:{ a:1, b:2, c:3 }, z:'' };

输出

obj1 = { x:1, y:{ a:1, b:2 } };


PS。对象有preventExtensions的方法,但它似乎只阻止属性的直接扩展而不是更深层的属性。

2 个答案:

答案 0 :(得分:4)

/*
    Recursively merge properties of two objects 
    ONLY for properties that exist in obj1
*/

var obj1 = { x:'', y:{ a:'', b:'' } };
var obj2 = { x:1, y:{ a:1, b:2, c:3 }, z:'' };

function merge(obj1, obj2) {
    for( var p in obj2 )
        if( obj1.hasOwnProperty(p) )
            obj1[p] = typeof obj2[p] === 'object' ? merge(obj1[p], obj2[p]) : obj2[p];

    return obj1;
}

merge(obj1, obj2 );
console.dir( obj1 ); // { x:1, y:{ a:1, b:2 } }

答案 1 :(得分:0)

对解决方案进行微调,添加对数组的支持(替换,不附加 - 这将更难):

function merge(obj1, obj2) {
    for( var p in obj2 )
        if( obj1.hasOwnProperty(p) )
            obj1[p] = (typeof obj2[p] === 'object' && !(p.length)) ? merge(obj1[p], obj2[p]) : obj2[p];

    return obj1;
}