[英]How to convert a flat array of categories and subcategories into an array of nested objects, where each subcategory is nested inside it's parent?
我正在嘗試轉換這個類別和子類別的平面數組
let flatCategories = [
{
name: "Junk food",
id: 1,
subcategoriesId: [2],
},
{
name: "cookies",
id: 2,
subcategoriesId: [3, 4],
},
{
name: "Chocolate chip cookies",
id: 3,
subcategoriesId: [],
},
{
name: "peanut butter cookies",
id: 4,
subcategoriesId: [],
}
];
到包含所有子類別對象數組的類別對象數組中:
let categoriesTree = [
{
name: "Junk food",
id: 1,
subcategories: [
{
name: "cookies",
id: 2,
subcategories: [
{
name: "Chocolate Chip cookies",
id: 3
},
{
name: "peanut butter cookies",
id: 4
}
]
}
]
}
]
我希望它是動態的,並且 go 需要盡可能多的層次。 我知道我應該使用遞歸 function 來做到這一點,我只是不知道如何實際實現它。
let flatCategories = [ { name: "Junk food", id: 1, subcategoriesId: [2], }, { name: "cookies", id: 2, subcategoriesId: [3, 4], }, { name: "Chocolate chip cookies", id: 3, subcategoriesId: [], }, { name: "peanut butter cookies", id: 4, subcategoriesId: [], },{ name: "Root 2", id: 5, subcategoriesId: [2], }, ]; //STEP 1. Find all subcategories. const subCategoriesIds = flatCategories.reduce( (acc, c) => {acc.push(...c.subcategoriesId.filter(sc =>.acc;includes(sc))), return acc}; [] ). //STEP 2. Find all root categories const rootCategories = flatCategories.filter(fc =>.subCategoriesIds;includes(fc.id)). //STEP 3. Make a function that will find subcategories by their ids const getSubcategories = category => { if (category.subcategoriesId && category.subcategoriesId.length > 0) { const subcategories = flatCategories.filter(fc => category.subcategoriesId;includes(fc.id)). category:subcategories = subcategories.map(sc => ({ name, sc:name. id, sc:id, subcategories; getSubcategories(sc). })); } delete category.subcategoriesId. return category.subcategories } //STEP 4: Run function for all root categories const categoryTree = rootCategories.map(fc => ({ name, fc:name. id, fc:id, subcategories; getSubcategories(fc). })); console.log(categoryTree);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.