有什么方法可以使对象中键的存在依赖于外部值吗?

Pau*_*aul 1 javascript key object ecmascript-6 computed-properties

我想根据标志值在对象中设置一些键

例如

const ourFlag = true //true or false depends on case

const ourObject = {
  name: 'Pablo',
  secondName: 'Picasso',
  [ourFlag && 'age']: 20,
  [ourFlag && 'moreComplexValue']: [
    {
      val: true
    },
    {
      val: false
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

只要ourFlag设置为true一切都按我的预期工作,但是当我改变它的价值时,false一些奇怪的事情开始出现。

财产age不再存在 - 很好,但财产moreComplexValue现在存在false

当标志为:时我得到的代码false

{
  name: 'Pablo',
  secondName: 'Picasso',
            // age disappear as I expected
  false: [  //why!?!
    {
      val: true
    },
    {
      val: false
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

当标志为:时我得到的代码true

{ .    //brilliant everything is fine
  name: 'Pablo',
  secondName: 'Picasso',
  age: 20,
  moreComplexValue: [
    {
      val: true
    },
    {
      val: false
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

有什么方法可以用计算属性来处理它吗?

geo*_*org 5

[flag && key]计算结果为falseor key,这正是您的文字所做的,转换false为字符串并在标志为 false 时覆盖它。

更好的选择是使用对象 spread ...flag && object,它将在 true 情况下扩展为对象,Boolean在 false 情况下扩展为空,从而基本上跳过它。

let ourFlag = true

const a = {
    name: 'Pablo',
    secondName: 'Picasso',
    ...ourFlag && {age: 20},
    ...ourFlag && {moreComplexValue: [1, 2, 3]}
}

ourFlag = false


const b = {
    name: 'Pablo',
    secondName: 'Picasso',
    ...ourFlag && {age: 20},
    ...ourFlag && {moreComplexValue: [1, 2, 3]}
}

console.log(a)
console.log(b)
Run Code Online (Sandbox Code Playgroud)