假设有两个对象
source = {
name: "A",
address: {
city: "B",
zipcode: "C"
},
car: {
make: "D",
model: "E"
}
};
target = {
name: "",
address: {
city: ""
}
};
现在我想将所有数据从源码复制到目标。但是,如果目标中已存在相应的属性,则只能进行复制。它类似于jQuery的扩展,没有添加新属性。使用上述数据,结果将是......
target = {
name: "A",
address: {
city: "B"
}
};
如何轻松实现这一目标?
答案 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];
}
}
}