将Javascript对象复制到另一个对象,而不是创建新属性

时间:2013-03-04 19:48:04

标签: javascript jquery

假设有两个对象

source = {
   name: "A",
   address: {
      city: "B",
      zipcode: "C"
   },
   car: {
      make: "D",
      model: "E"      
   }
};

target = {
   name: "",
   address: {
      city: ""
   }
};

现在我想将所有数据从源码复制到目标。但是,如果目标中已存在相应的属性,则只能进行复制。它类似于jQuery的扩展,没有添加新属性。使用上述数据,结果将是......

target = {
   name: "A",
   address: {
      city: "B"
   }
};

如何轻松实现这一目标?

2 个答案:

答案 0 :(得分:3)

这应该这样做:

function extend(target, source) {
    for (var prop in source)
        if (prop in target) // <== test this
            if (typeof target[prop] === "object")
                extend(target[prop], source[prop]);
            else
                target[prop] = source[prop];
}

免责声明:这个简单的不适用于数组,可枚举的原型属性,null值...

您最好将最外层的循环更改为

    for (var prop in target)
        if (prop in source)

取决于两个对象中哪一个具有较少的枚举属性。

答案 1 :(得分:1)

你可以循环遍历target,然后从`source获取值。我建议使用递归函数,因为你的对象可能有多个子对象。

function fill_in_values(target, source){
    for(var prop in target){
        if(typeof target[prop] === 'object'){
            fill_in_values(target[prop], source[prop]);
        }
        else{
            target[prop] = source[prop];
        }
    }
}