Объединить объекты в массиве, если они имеют одинаковую дату - PullRequest
0 голосов
/ 12 марта 2019

У меня есть массив объектов. Если 2 или более объектов имеют одну и ту же дату, я хочу объединить их в один объект. Например, если у меня есть это:

const rawData = [
  {
    date: '3/10/2019',
    a: '123',
  },
  {
    date: '3/10/2019',
    b: '456',
  },
  {
    date: '3/11/2019',
    a: '789',
  },
  {
    date: '3/11/2019',
    b: '012',
  },
  {
    date: '3/11/2019',
    c: '345',
  }
];

Тогда я хочу, чтобы модифицированный массив выглядел так:

const myDesiredResult = [
  {
    date: '3/10/2019',
    a: '123',
    b: '456',
  },
  {
    date: '3/11/2019',
    a: '789',
    b: '012',
    c: '345',
  }
];

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

Я бы предпочел сделать это с простым javascript, если есть чистый способ сделать это, но я открыт для использования lodash в случае необходимости.

1 Ответ

0 голосов
/ 13 марта 2019

Это хороший вариант использования для снижения.

const rawData = [
  {
    date: '3/10/2019',
    a: '123',
  },
  {
    date: '3/10/2019',
    b: '456',
  },
  {
    date: '3/11/2019',
    a: '789',
  },
  {
    date: '3/11/2019',
    b: '012',
  },
  {
    date: '3/11/2019',
    c: '345',
  }
];

const groupByDate = array => array.reduce((results, item) => {
  const current = results.find(i => i.date === item.date);
  if (current) {
    for (let property in item) {
      if (property !== 'date') {
        current[property] = item[property];
      }
    }
  } else {
    results.push({...item});
  }
  return results;
}, []);

console.log(groupByDate(rawData));
...