Это на самом деле две проблемы: цикл по массиву объектов для объединения их в один объект и цикл по объекту для объединения всего его массива.
Сначала разбираемся со вторым, что-то вроде этого работа:
const concatArraysInObject = obj =>
Object.values(obj).reduce((result, arr) => result.concat(arr), []);
const input = { a: [1,2,3], b: [4,5,6], c: [7,8,9] };
const output = concatArraysInObject(input);
console.log(output);
Object.values()
даст вам массив всех массивов в объекте.
Функция reduce()
принимает два параметра: функцию и начальную значение.
Функция также должна принимать (как минимум) 2 параметра: результат последнего вызова (или начальное значение) и текущее значение в массиве.
Это вызовет функция один раз для каждого элемента в массиве.
Теперь, когда это решено, мы можем решить первую проблему.
Для этого мы также можем использовать reduce()
, и мы ' Построим наш комбинированный объект при каждом вызове.
const concatArraysInObject = (obj) =>
Object.values(obj).reduce((result, arr) => result.concat(arr), []);
const mergeObjectsInArray = (arr, dataKey) =>
arr.reduce((result, obj) => ({ ...result, [obj.id]: concatArraysInObject(obj[dataKey]) }), {});
const input = [
{ id: 'A', data: { a: [1,2,3], b: [4,5,6] } },
{ id: 'B', data: { c: [7,8,9], d: [10,11,12] } }
];
const output = mergeObjectsInArray(input, 'data');
console.log(output);
Важное предупреждение: порядок ключей объекта НЕ гарантируется в JavaScript. Хотя в 99% случаев они будут в том порядке, в котором вы ожидаете, это не является гарантией, поэтому, если вы зависите от порядка ключей для порядка массива (если порядок имеет значение), вы захотите изменить свой структура ввода. Если порядок не имеет значения, вероятно, все в порядке.