1

假设有两个对象

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

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

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

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

如何轻松实现这一目标?

4

2 回答 2

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值……</sub>

您不妨将最外层的循环更改为

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

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

于 2013-03-04T19:54:48.733 回答
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];
        }
    }
}
于 2013-03-04T19:55:28.357 回答