Если у вас возникла рекурсивная проблема, начните с создания функции, которую вы ожидаете вызвать сама.
Код можно сделать чище, используя loda sh s pick
и flatten
interface CategoryListItem {
name: string;
level: number;
id: number;
categoryList?: CategoryListItem[];
}
interface NewCategoryListItem {
name: string;
level: number;
id: number;
parentId?: number;
}
const root: CategoryListItem = {
id: 1,
name: '1',
level: 1,
categoryList: [
{
id: 2,
name: '2',
level: 2,
categoryList: [
{
id: 3,
name: '3',
level: 3,
},
{
id: 4,
name: '4',
level: 3,
},
]
}
]
};
function transform(item: CategoryListItem, parent?: NewCategoryListItem, level = 1): NewCategoryListItem[] {
const newItem = {
id: item.id,
name: item.name,
level,
parentId: parent?.id,
};
const newChildren = item.categoryList?.map(child => transform(child, newItem, level + 1)) ?? [];
const newChildrenFlat = ([] as NewCategoryListItem[]).concat(...newChildren);
return [
newItem,
...newChildrenFlat,
]
}
console.log(transform(root));
// 0: {id: 1, name: "1", level: 1, parentId: undefined}
// 1: {id: 2, name: "2", level: 2, parentId: 1}
// 2: {id: 3, name: "3", level: 3, parentId: 2}
// 3: { id: 4, name: "4", level: 3, parentId: 2 }