合并没有新键的JSON对象

merge JSON objects without new keys

本文关键字:JSON 对象 新键 并没有      更新时间:2023-09-26

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

输入
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,但它似乎只阻止属性的直接扩展,而不是更深的扩展。

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

对解决方案进行了一些小调整,增加了对数组的支持(替换,而不是追加——那样会比较困难):

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