попытался решить все через рекурсию
Рекурсией конечно можно:
const createTree = (data, idProp, parentProp, parentId) =>
data.reduce((acc, n) => (parentId === n[parentProp] && acc.push({
...n,
children: createTree(data, idProp, parentProp, n[idProp]),
}), acc), []);
const tree = createTree(data, 'id', 'parentId', null);
Но вовсе не обязательно:
function createTree(data, idProp, parentProp) {
const tree = Object.fromEntries(data.map(n => [ n[idProp], { ...n, children: [] } ]));
return Object
.values(tree)
.filter(n => !(tree[n[parentProp]] && tree[n[parentProp]].children.push(n)));
}
const tree = createTree(data, 'id', 'parentId');