Группировать объекты с общим ключом в массиве - PullRequest
0 голосов
/ 22 апреля 2019

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

Данные, которые у меня есть, как показано ниже

var array = [
  { id: 'Staging', cumulative: 16 },
  { id: 'Staging', yeasterday: 16 },
  { id: 'Staging', week: 16 },
  { id: 'Staging', yeasterday: 16 },

  { id: 'Staging1', cumulative: 16 },
  { id: 'Staging1', yeasterday: 16 },
  { id: 'Staging1', week: 16 },
];

Ожидаемые результаты, предположительно ниже

var array = [
  { id: 'Staging', cumulative: 16, month: 16, week: 16, yeasterday: 16 },

  { id: 'Staging1', cumulative: 16, yeasterday: 16, week: 16 },
];

Ответы [ 3 ]

1 голос
/ 22 апреля 2019

Использовать reduce примерно так:

var array = [{
  id: "Staging",
  cumulative: 16
}, {
  id: "Staging",
  yeasterday: 16
}, {
  id: "Staging",
  week: 16
}, {
  id: "Staging",
  yeasterday: 16
}, {
  id: "Staging1",
  cumulative: 16
}, {
  id: "Staging1",
  yeasterday: 16
}, {
  id: "Staging1",
  week: 16
}]

var newArray = array.reduce((acc, { id, ...rest }) => {
  acc[id] = { ...(acc[id] || {}), ...rest };
  return acc;
}, {});

console.log(newArray);
0 голосов
/ 23 апреля 2019

Вы можете легко использовать библиотеку lodash и получить результаты

var result = _.chain(array)
              .groupBy('id')
              .map((val) => _.reduce(val, (result, value) => _.merge(result, value), {}))
              .value()
0 голосов
/ 22 апреля 2019

Этого можно добиться с помощью Vanilla JavaScript (без каких-либо неуклюжих внешних библиотек, таких как Lodash).Мой подход потребует от вас использования Array.reduce () вместе с Map , который является одной из функций ES6.Затем мы можем использовать расширенный синтаксис (или Array.from () ) для преобразования объекта Iterator (который содержит значения каждого элемента из объекта Map)в массив, чтобы получить формат, аналогичный требуемому выводу, как указано в вопросе.

const arr = [ {id: "Staging", cumulative: 16}, {id: "Staging", yeasterday: 16}, {id: "Staging", week: 16}, {id: "Staging", yeasterday: 16},
{id: "Staging1", cumulative: 16}, {id: "Staging1", yeasterday: 16}, {id: "Staging1", week: 16}
]

const iteratorMap = arr.reduce((entry, e) => entry.set(e['id'], {...entry.get(e['id'])||{}, ...e}), new Map()).values();

const result = [...iteratorMap];

console.log(result);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...