如何合并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
没有相应的属性,则此操作将不起作用。