考虑以下代码,其中一个对象由两部分组成:值及其相应的描述:

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的可能的副作用,这将是使用更简单的||形式的更大动力,除非您为将来的程序员设置诱饵陷阱。)

08-25 11:53
查看更多