преобразование массива в объект с учетом ключей одного и того же значения - PullRequest
0 голосов
/ 20 октября 2018

Я пытаюсь найти простой способ преобразовать массив объектов в объект

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

   [
      {
       "id": "-LP9_kAbqnsQwXq0oGDT",
       "value": Object {
         "date": 1541482236000,
         "title": "First",
       },
     },
    .... more objects here
   ]

И идентификатор какпреобразовать его в объект с временными метками в качестве ключей и массивами объектов, соответствующих этой дате.Если этот ключ уже существует, то добавьте объект в соответствующий массив, связанный с этим ключом

 {
   1541482236000: 
     [{
           "id": "-LP9_kAbqnsQwXq0oGDT",
           "value": Object {
             "date": 1541482236000,
             "title": "First",
           },
         },
         {
           "id": "-LP9_kAbqnsQwXqZZZZ",
           "value": Object {
             "date": 1541482236000,
             "title": "Some other title",
           },
         },
        .... more objects here
     ],
  1541482236001: 
     [{
           "id": "-LP9_kAbqnsQ1234",
           "value": Object {
             "date": 1541482236001,
             "title": "Another title",
           },
         },

        .... more objects here
     ]
 }

. Мне удалось добиться чего-то подобного, используя Reduce.Однако он не обрабатывает добавление объектов в массив, когда их ключ уже существует.

calendarReminders = action.value.reduce((obj, reminder) => {
                dateKey = moment(reminder.value.date).format('YYYY-MM-DD')
                obj[dateKey] = [reminder]
                return obj;
            }, {});

Как я могу это сделать?

Ответы [ 2 ]

0 голосов
/ 20 октября 2018

Вам просто нужно проверить, является ли объект уже ключом, и если нет, добавить его со значением массива.Тогда вы можете просто push() в него:

let arr = [{"id": "-LP9_kAbqnsQwXq0oGDT","value":  {"date": 1541482236000,"title": "First",},},{"id": "SomID","value":  {"date": 1541482236000,"title": "Some other title",},},{"id": "A different ID","value":  {"date": 1541482236001,"title": "A third title",},}]

 let calendarReminders = arr.reduce((obj, reminder) => {
    (obj[reminder.value.date] || (obj[reminder.value.date] = [])).push(reminder)
    return obj;
}, {});
console.log(calendarReminders)

Если вы хотите моментально установить ключи в другом формате, вы сможете сделать это без изменения основной идеи.

0 голосов
/ 20 октября 2018

Пожалуйста, проверьте приведенный ниже код!

Сначала вы перебираете свой массив данных, если у вашего результирующего объекта / словаря уже есть ключ, тогда вы просто добавляете текущий элемент

, иначе вы делаетеключ и установить значение

const data = [];

let result = {};

for (const item of data) {
  const key = item.value.date;
  if (result.hasOwnProperty(key)) {
    const prevData = result[key];
    result[key] = [...prevData, item];
  } else {
    result[key] = [item];
  }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...