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
or undefined
,否则返回其左侧操作数。有关此运算符的更多详细信息,请参阅空合并运算符 (??)
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));
使用 hasOwnProperty() 方法
??
对于属性,运算符将失败null
or 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
运算符检查源对象中是否存在属性,但请记住in
如果指定的属性位于指定的对象或其原型链中,则运算符返回 true。有关详细信息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));
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)