@anastasia__galkina

Как массив объектов собрать в один объект, объединив одноимённые свойства в массивы?

Есть массив объектов:

let array = [
  {
    'key1.key2.a': 'a1', 
    'key1.key2.b': 'b1',
    'key1.key2.c': 'c1',
  },
  {
    'key1.key2.a': 'a2', 
    'key1.key2.b': 'b2',
    'key1.key2.d': 'd2',
  }
]

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

let result = {
  'key1.key2.a': ['a1', 'a2'],
  'key1.key2.b': ['b1', 'b2'],
  'key1.key2.c': ['c1', null],
  'key1.key2.d': [null, 'd2']
}
  • Вопрос задан
  • 140 просмотров
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Получаем все возможные ключи; под каждый создаём пустой массив; при обработке объекта из исходного массива бежим по массиву ключей, добавляем в соответствующий массив значение из объекта или дефолтное - в зависимости от наличия ключа в объекте:

function groupValues(arr, defaultValue = null) {
  const keys = [...new Set(arr.flatMap(Object.keys))];
  return arr.reduce((acc, n) => {
    keys.forEach(k => acc[k].push(Object.hasOwn(n, k) ? n[k] : defaultValue));
    return acc;
  }, Object.fromEntries(keys.map(k => [ k, [] ])));
}


const result = groupValues(arr);

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

const groupValues = (arr, defaultValue = null) =>
  arr.reduce((acc, n, i, a) => (
    Object
      .keys(n)
      .forEach(k => (acc[k] ??= Array(a.length).fill(defaultValue))[i] = n[k]),
    acc
  ), {});
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы