Задать вопрос
@The_Last_Dot

Как можно коротко перебрать массив объектов и преобразовать по одинаковому id при помощи javascript?

есть массив объектов
const data = [
  {id: 1, color: red},
  {id: 1, color: black},
  {id: 2, color: green},
  {id: 3, color: white},
  {id: 3, color: blue}
  ...
]


как можно коротко преобразовать данный массив при помощи javascript в вид
const data = [
  {id: 1, colors: [red, black]},
  {id: 2, color: green},
  {id: 3, color: [white, blue]},
]
  • Вопрос задан
  • 177 просмотров
Подписаться 1 Простой Комментировать
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Вот коротко:

const group = (arr, idKey, valKey) =>
  Object.values(arr.reduce((acc, { [idKey]: id, [valKey]: val }) => (
    (acc[id] ??= { [idKey]: id, [valKey]: [] })[valKey].push(val),
    acc
  ), {}));

const result = group(data, 'id', 'color');

Но если вдруг краткость не основной приоритет, то можно сообразить функцию группировки более универсальную:

function group(data, key, val = n => n) {
  const getKey = key instanceof Function ? key : n => n[key];
  const getVal = val instanceof Function ? val : n => n[val];
  const result = new Map;

  for (const n of data) {
    const k = getKey(n);
    result.set(k, result.get(k) ?? []).get(k).push(getVal(n));
  }

  return result;
}

const result = Array.from(
  group(data, 'id', 'color'),
  ([ id, colors ]) => ({ id, colors })
);
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы