是否存在Javascript或Lodash中的函数,可以用另一个对象中的值“更新”一个对象,而无需添加新键?
var foo = { 'a': 0, 'b': 1 }
var bar = { 'b': 2, 'c': 3 }
诸如update(foo,bar),覆盖(“更新”)任何现有键之类的东西,但不添加不存在的键:
{ 'a': 0, 'b': 2 }
在StackOverflow上几乎肯定有类似的问题,但我一直找不到。
以下是一些可以达到预期效果的方法。
以下代码段未修改原始对象,而是使用目标对象的所有键创建了一个新对象。
Nullish coalescing operator
当其左侧操作数为null
或时undefined
,返回其右侧操作数,否则返回其左侧操作数。有关此运算符的更多详细信息,请参见Nullish合并运算符(??)。
var foo = { 'a': 0, 'b': 1 }
var bar = { 'b': 2, 'c': 3 }
function update(target, src) {
const res = {};
Object.keys(target)
.forEach(k => res[k] = (src[k] ?? target[k]));
return res;
}
console.log(update(foo, bar));
??
运算符将失败带有null
或undefined
值的属性。或者,您可以使用hasOwnProperty()
方法。有关此方法的详细信息,请参见Object.prototype.hasOwnProperty()
var foo = { 'a': 0, 'b': 1 }
var bar = { 'b': 2, 'c': 3 }
function update(target, src) {
const res = {};
Object.keys(target)
.forEach(k => res[k] = (src.hasOwnProperty(k) ? src[k] : target[k]));
return res;
}
console.log(update(foo, bar));
您还可以使用in
运算符检查源对象中是否存在属性,但是请记住,in
如果指定的属性在指定的对象或其原型链中,则运算符返回true。有关in
运算符的详细信息,请参阅in
var foo = { 'a': 0, 'b': 1 }
var bar = { 'b': 2, 'c': 3 }
function update(target, src) {
const res = {};
Object.keys(target)
.forEach(k => res[k] = (k in src ? src[k] : target[k]));
return res;
}
console.log(update(foo, bar));
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句