Есть ли способ зависеть от наличия ключа в объекте от внешнего значения? - PullRequest
1 голос
/ 31 октября 2019

Я хочу установить некоторые ключи в объекте в зависимости от значения флага

Например,

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

const ourObject = {
  name: 'Pablo',
  secondName: 'Picasso',
  [ourFlag && 'age']: 20,
  [ourFlag && 'moreComplexValue']: [
    {
      val: true
    },
    {
      val: false
    }
  ]
}

Пока ourFlag установлен на true, все работает, как я ожидал,но когда я изменяю его значение на false, начинают появляться некоторые странные вещи.

свойство age больше не присутствует - хорошо, но свойство moreComplexValue теперь false

КодЯ получаю, когда флаг равен false:

{
  name: 'Pablo',
  secondName: 'Picasso',
            // age disappear as I expected
  false: [  //why!?!
    {
      val: true
    },
    {
      val: false
    }
  ]
}

Код, который я получаю, когда флаг равен true:

{ .    //brilliant everything is fine
  name: 'Pablo',
  secondName: 'Picasso',
  age: 20,
  moreComplexValue: [
    {
      val: true
    },
    {
      val: false
    }
  ]
}

Есть ли способ справиться с этими вычисленными свойствами?

Ответы [ 2 ]

4 голосов
/ 31 октября 2019

[flag && key] оценивается как false или key, и это именно то, что делает ваш литерал, преобразовывая false в строку и перезаписывая ее, когда флаг имеет значение false.

Лучший вариантбудет использовать объектный разброс ...flag && object, который будет расширяться до объекта в истинном случае, и до пустого Boolean в ложном случае, таким образом, по существу, пропуская его.

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)
1 голос
/ 31 октября 2019

Проблема заключается в том, что ключи объектов javascript всегда являются строками и в некоторых случаях преобразуются в строки.

Таким образом, строка становится ложной, если значение равно false, и один и тот же ключ используется дважды ипереписать со вторым значением

Чтобы установить ключи динамически, вы можете установить его на неопределенное или установить его, если..else

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

const ourObject = {
  name: 'Pablo',
  secondName: 'Picasso',
}
if(ourFlag) {
  ourObject.age = 20;
  ourObject.moreComplexValue = [
    {
      val: true
    },
    {
      val: false
    }
  ];
}
...