考虑以下代码,其中一个对象由两部分组成:值及其相应的描述:
let flagConfigObj = {};
const features = {
f1: {
value: 1,
type: 'type1'
},
f2: {
value: 2,
type: 'type2'
}
};
let featuresDescription = {
f1: {
description: 'desc 1'
},
f2: {
description: 'desc 2'
}
};
Object.keys(features).forEach(key => {
flagConfigObj[key] = {
...features[key],
...(featuresDescription[key] || { some: 'backup' })
};
});
console.log(flagConfigObj);
您可能会注意到,在构造复合材料时,有
||
运算符可防止表单散布不存在的对象并将其替换为某些默认模板。因此,此代码的输出将是:{
f1: { value: 1, type: 'type1', description: 'desc 1' },
f2: { value: 2, type: 'type2', description: 'desc 2' }
}
但是当
featuresDescription
中缺少相应的描述字段时,它将替换为:{
f1: { value: 1, type: 'type1', description: 'desc 1' },
f2: { value: 2, type: 'type2', some: 'backup' }
}
问题
如何用三元运算符
||
替换?:
语法?我尝试过一些有趣的组合,例如
featuresDescription[key] ? ...featuresDescription[key] : {some: 'backup'}
{featuresDescription[key]} ? ...featuresDescription[key] : {some: 'backup'}
但是它们都给了语法错误,我现在感觉就像只是盲目地随机化
[,],},{,...
的位置,而不是真正地理解它...一如既往的任何帮助表示赞赏!
最佳答案
扩展语法是对象初始值设定项语法的一部分,而不是通用表达式语法的一部分,因此整个? :
必须在右边:
... featuresDescription[key] ? featuresDescription[key] : { some: "backup" }
在这种情况下,使用简单的
||
与原始版本之间没有任何有效的区别。表达方式expr1 ? expr1 : expr2
意思是,“如果expr1评估为“真实”值,则使用其值;否则使用expr2的值”。那和什么完全一样
expr1 || expr2
手段。 (好吧,忽略
expr1
的可能的副作用,这将是使用更简单的||
形式的更大动力,除非您为将来的程序员设置诱饵陷阱。)