Как заменить поля объекта содержимым вложенного поля? - PullRequest
0 голосов
/ 27 июня 2018

Это мой объект, который мне нужно изменить:

const doc = { 
  _id: 'ZjenyEXyLChbksHqL',
  content: {
    en: [
      { 
        content: 'Content',
        timestamp: 1518811796,
        reviewed: { 
          user: '5b0b9e1153e8a750642e9caf',
          timestamp: 1518811796
        },
        finalized: { 
          user: '5b0b9e1153e8a750642e9caf',
          timestamp: 1518811796
        }
      }
    ]
  },
  reference: [ 'hp9v53uQqQPRXSYAi' ],
  main: 'XN7iqmCFD4jpgJZ6f'
}

Мне нужно заменить объект содержимого первым объектом массива en.

Результат должен выглядеть следующим образом:

{ 
  _id: 'ZjenyEXyLChbksHqL',
  content: 'Content',
  reviewed: { 
    user: '5b0b9e1153e8a750642e9caf',
    timestamp: 1518811796
  },
  finalized: { 
    user: '5b0b9e1153e8a750642e9caf',
    timestamp: 1518811796
  },
  reference: [ 'hp9v53uQqQPRXSYAi' ],
  main: 'XN7iqmCFD4jpgJZ6f'
}

Моя попытка выглядит так:

const language = 'en'
const data = (doc && doc.content && doc.content[language] && doc.content[language][0]) || {}
doc.content = data.content
doc.reviewed = data.reviewed
doc.finalized = data.finalized

Это выглядит не очень элегантно. Разве я не могу использовать оператор распространения или что-то вроде этого?

Также моя проблема в том, что reviewed и finalized не обязательны. В этом случае я не хочу устанавливать этот ключ. В моем коде я получаю finalized: undefined.

Ответы [ 2 ]

0 голосов
/ 27 июня 2018

Да, вы можете использовать оператор распространения.

const data = (doc && doc.content && doc.content[language] && doc.content[language][0]) || {}

const newDoc = {
    ...doc,
    ...data
}
0 голосов
/ 27 июня 2018
Object.assign(doc, ((doc.content || {})[language] || [{}])[0])

Вы можете использовать Object.assign для копирования всех значений. Это может быть немного элегантнее, если использовать утилиту:

const get = (obj, ...keys) => keys.reduce((obj, key) => obj[key] || {}, obj);

Object.assign(doc, get(doc, "content", language, 0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...