Сокращение значения свойства ES6 из неопределенного

1

Я хотел бы использовать сокращенное значение свойства, но только когда значение определено, рассмотрим следующий пример:

const personByName = name => {
  const person = http(name)
  return { person, method: 'byName' }
}

personByName('john') // found person: { person: { name: 'john', age: 30 }, method: 'byName' }
personByName('paul') // not found: { method: 'byName' }

Но текущий выход я получаю:

personByName('paul') // not found: { person: undefined, method: 'byName' }
  • 0
    Вы уверены, что не хотите http.get(name) ?
  • 1
    Почему вы хотите этого?
Показать ещё 3 комментария
Теги:
ecmascript-6

3 ответа

1
Лучший ответ

Для использования сокращенного свойства Object.assign можно использовать:

const personByName = name => {
  const person = http(name);
  return Object.assign({ method: 'byName' }, person && { person });
}

Последующие не объектные аргументы Object.assign эффективно игнорируются, поэтому фальшивый person не влияет на результат.

Это будет работать, если person, как ожидается, будет объектом, как показано в исходном коде.

В случае, если только неопределенные значения не разрешены, это:

Object.assign({ method: 'byName' }, person !== undefined && { person });
  • 0
    Умная! Я не мог думать, чтобы добавить условие там ... Руки вниз
1

Я думаю, вам нужно что-то вроде этого:

const personByName = name => {
  const person = http(name);
  const result = { method: 'byName' };
  if (person) { result.person = person; }
  return result;
}

Там нет пропусков, объявляющих свойство объекта, если оно undefined.

  • 0
    Хотя это работает, я пытался найти способ избежать этого дополнительного шага условного + мутация result ... Я думаю, вы правы, что нет способа пропустить неопределенное свойство.
  • 0
    Я не понимаю, почему понижающий голос: / было бы хорошо, если бы голосующий мог добавить комментарий
1

В ES2018, вы можете использовать тройной оператор в Eval, если определенный объект и распространение построить объект, который содержит a a и b, или просто b:

const a = 1
const b = { b: 2 }
const c = a ? { a, ...b } : b

console.log( c ) 

const a = undefined
const b = { b: 2 }
const c = a ? { a, ...b } : b

console.log( c ) 
  • 0
    Следует отметить, что это ES2018, а не ES6.
  • 0
    @estus исправлено ;-)
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню