如何合并javascript两个对象,但只更新更改的属性
在下面的示例中,我正在尝试编写一个函数来更新我的如何合并javascript两个对象,但只更新更改的属性,javascript,underscore.js,Javascript,Underscore.js,在下面的示例中,我正在尝试编写一个函数来更新我的kitchen。然而,在更新整个冰箱对象时,使用类似下划线的扩展,会将冰箱中的啤酒吹走 有没有一种简单的方法可以让我只更新changeKitchen对象中更改的属性,而不更新整个冰箱对象 // My original kitchen var kitchen = { fridge: { beer: true, celery: false }, cabinets: { candy: true } }; //
kitchen
。然而,在更新整个冰箱
对象时,使用类似下划线的扩展
,会将冰箱中的啤酒吹走
有没有一种简单的方法可以让我只更新changeKitchen
对象中更改的属性,而不更新整个冰箱
对象
// My original kitchen
var kitchen = {
fridge: {
beer: true,
celery: false
},
cabinets: {
candy: true
}
};
// updates I would like to make to my kitchen
var changeKitchen = {
fridge: {
celery: true
}
};
var updatedKitchen = _.extend(kitchen, changeKitchen);
console.log(updatedKitchen);
返回
var kitchen = {
fridge: {
celery: false // beer is gone
},
cabinets: {
candy: true
}
};
然而,我希望:
var kitchen = {
fridge: {
beer: true,
celery: true // changed
},
cabinets: {
candy: true
}
};
因为您已经在使用下划线,所以可以改为使用下划线的超集,并使用其函数 看到这个问题了吗
//我原来的厨房
var厨房={
冰箱:{
啤酒:是的,
芹菜:假的
},
机柜:{
坎蒂:是的
}
};
//我想对我的厨房进行更新
var changeKitchen={
冰箱:{
芹菜:是的
}
};
var updatedKitchen=\ u0.merge(kitchen,changeKitchen);
document.write(JSON.stringify(updatedKitchen))代码>
使用\在嵌套对象上扩展:
function update(obj1, obj2) {
for (var p in obj2) {
if (obj1[p]) {
_.extend(obj1[p], obj2[p]);
} else {
obj1[p] = obj2[p];
}
}
}
update(kitchen, changeKitchen);
尝试在
循环中为..使用Object.keys()
//我原来的厨房
var厨房={
冰箱:{
啤酒:是的,
芹菜:假的
},
机柜:{
坎蒂:是的
}
};
var changeKitchen={
冰箱:{
芹菜:是的
}
};
用于(厨房中的var道具){
如果(厨房[道具]){
厨房[道具]
[Object.keys(changeKitchen[prop])]=changeKitchen[prop]
[对象键(更改厨房[prop])]
}
}
console.log(kitchen)
这里有一个纯Javascript解决方案:
var kitchen={冰箱:{啤酒:真,芹菜:假},橱柜:{糖果:真},
changeKitchen={冰箱:{芹菜:真的}};
函数更新(源、目标){
Object.keys(目标).forEach(函数(k){
if(目标[k]==“对象”的类型){
源[k]=源[k]|{};
更新(源[k],目标[k]);
}否则{
源[k]=目标[k];
}
});
}
更新(厨房、更衣室);
document.write(''+JSON.stringify(kitchen,0,4)+'')
您是否尝试过使用deep
选项从jQuery扩展extend
)您也可以使用merge在lodash中执行此操作。我没有,谢谢@longuyen。如果下划线有这个选项就好了:/。虽然它看起来像是洛达斯。合并可能是西米拉拉,打败我吧。谢谢@Atheistp3ace如果obj1
没有相应的属性,则此操作将不起作用。