ES6: как можно условно добавить свойство (которое само является объектом) к объекту, только если это свойство существует - PullRequest
0 голосов
/ 23 апреля 2020

Я следую этому замечательному учебнику для добавления свойства (или нет) к объекту на основе условия.

Например:

{  id: 'some-id',  ...(true && { optionalField: 'something'})}

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

enter image description here

Что я хотел бы сделать, если существует свойство 12-AM, дон не перезаписывайте его, добавьте к его свойство, которое является ключом с именем message, которое является массивом

И если оно не добавляет новый ключ времени, то есть 1230-AM к April-9-2020

Это то, что у меня сейчас есть:

{
  ...dayInfoInChild,
  [currentDate]: { /* April-9-2020 */
    [timeOfDayAndHour]: { /* 12-AM */
      message: textValueContainer, ['foo']
    },
  },
}

Но, увы, оно не добавляет, оно перезаписывает ...

Любая помощь будет оценена.

1 Ответ

1 голос
/ 23 апреля 2020

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

// Checking existence:
if (obj[currentDate] && obj[currentDate][timeOfDayAndHour]) {
    console.log('exist');
}

// Checking if message exist:
if (obj[currentDate][timeOfDayAndHour].message) {
    console.log('exist');
}

// Adding message array:
obj[currentDate][timeOfDayAndHour].message = [];

// Adding message array with message:
obj[currentDate][timeOfDayAndHour].message = ['foo'];

// Adding message:
obj[currentDate][timeOfDayAndHour].message.push('foo');

Теперь, используя описанные выше операции, вы можете реализовать свою логику c. Я не знаю, какой у вас точный лог c, но мы можем продемонстрировать одну реализацию. Ниже приведен пример того, как добавить сообщение, только если дата существует, но не имеет значения, существует ли время суток или массив сообщений (он автоматически создаст их):

function addMessageToDateAutoCreateEverythingElse (obj, date, time, txt) {
  let dateObj = obj[date]

  // Checking date exist:
  if (dateObj) {
    let timeObj = dateObj[time];

    // Auto-create time if not exist
    if (!timeObj) {
      timeObj = {};
      dateObj[time] = timeObj;
    }

    // Auto-create message array if not exist
    if (!timeObj.message) {
      timeObj.message = [];
    }

    // Add new message
    timeObj.message.push(txt);
  }
}  

This есть только один лог c поток. Вы можете реализовать любую логику c, которую вам нравится, добавлять что-либо к любому объекту.

...