我如何动态合并两个JavaScript对象的属性?

我需要能够在运行时合并两个(非常简单的)JavaScript对象。 例如,我想:

var obj1 = { food: 'pizza', car: 'ford' }
var obj2 = { animal: 'dog' }

obj1.merge(obj2);

//obj1 now has three properties: food, car, and animal

有没有人有这个脚本或知道内置的方式来做到这一点? 我不需要递归,也不需要合并函数,只需要平面对象上的方法。


使用:

//Takes any number of objects and returns one merged object
var objectMerge = function(){
    var out = {};
    if(!arguments.length)
        return out;
    for(var i=0; i<arguments.length; i++) {
        for(var key in arguments[i]){
            out[key] = arguments[i][key];
        }
    }
    return out;
}

它经过测试:

console.log(objectMerge({a:1, b:2}, {a:2, c:4}));

它导致:

{ a: 2, b: 2, c: 4 }

戈西的David Coallier方法的延伸:

检查这两行:

from = arguments[i];
Object.getOwnPropertyNames(from).forEach(function (name) {

需要检查空对象的“from”...如果例如合并来自先前在服务器上创建的Ajax响应的对象,则对象属性可以具有值“null”,并且在这种情况下上述代码生成一个错误说:

“from”不是一个有效的对象

例如,用“if(from!= null){...}”包装“... Object.getOwnPropertyNames(from).forEach ...”函数将防止发生错误。


JSON字符串和值的深度递归合并 (更好地实现Markus的答案):

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

例:

o1 = { a:1, b:2, c:{ ca:1, cb:2, cc:{ cca:100, ccb:200 }}};
o2 = { a:10, c:{ ca:10, cb:20, cc:{ cca:101, ccb:202 }}};
mergeRecursive(o1, o2);

输出:

{ a : 10,
     b : 2,
     c : {
         ca : 10,
         cb : 20,
         cc : {
             cca : 101,
             ccb : 202
         }
     }
};
链接地址: http://www.djcxy.com/p/4697.html

上一篇: How can I merge properties of two JavaScript objects dynamically?

下一篇: Object comparison in JavaScript