У меня есть функция под названием tree, которая принимает массив объектов (как поля данных из базы данных) и массив строк для ключей. Функция перебирает rowArray и рекурсивно создает объект с вложенными свойствами на основе keyArray.
const tree = (rowsArray, keysArray) => {
return rows.reduce((acc, row) => {
const groupBy = (row, keys,) => {
const [first, ...rest] = keys;
if (!first) return [row];
return {
[row[first]]: groupBy(row, rest),
}
};
acc = {...groupBy(row, keys), ...acc};
return acc;
}, {});
}
Данные следующие:
const data = [{
ID: 1,
Main: "Financial",
Sub: "Forecasts",
Detail: "General"
}, {
ID: 2,
Main: "Financial",
Sub: "HR",
Detail: "Headcount"
}];
const result1 = tree(data, ["Main", "Sub", "Detail"]);
console.log(result1);
Когда я регистрирую результат, я получаю:
/*
// actual output
{
Financial: {
Forecasts: {
General: [Array]
}
}
}
Принимая во внимание, я хотел бы получить следующее:
// expected
{
Financial: {
Forecasts: {
General: [Array]
},
HR: {
Headcount: [Array]
}
}
}
*/
Проблема в том, что переменная acc в основной функции переопределяется, и я получаю новый объект вместо накопительного, и я не совсем уверен, как рекурсивно построить этот объект. Я пытался передать экземпляры acc в функцию groupBy (чтобы запомнить предыдущие результаты), но безуспешно.
У вас есть идеи, как я мог бы переписать функцию дерева или функцию groupBy для достижения своей цели? Спасибо!