Javascript 仅具有父ID时,将普通数组转换为嵌套数组
父id表示另一个类别id,它是它的父id。使用下面的数据集,我尝试以编程方式实现如下结构:Javascript 仅具有父ID时,将普通数组转换为嵌套数组,javascript,arrays,Javascript,Arrays,父id表示另一个类别id,它是它的父id。使用下面的数据集,我尝试以编程方式实现如下结构: | Cat Top Level 1 | Cat Top Level 2 | Cat Top Level 3 | --- Cat Top 3 Child 1 | --- Cat Top 3 Child 2 | ------ Cat Top 3 Child 2 Child 1 | --------- Cat Top 3 Child 2 Child 1 Child 1 | --- Cat Top 3 Child
| Cat Top Level 1
| Cat Top Level 2
| Cat Top Level 3
| --- Cat Top 3 Child 1
| --- Cat Top 3 Child 2
| ------ Cat Top 3 Child 2 Child 1
| --------- Cat Top 3 Child 2 Child 1 Child 1
| --- Cat Top 3 Child 3
这些对象需要合并为一个对象和另一个对象。如果将“子”类别推送到其直接的“父”类别中,则该类别必须包含一个新属性,以创建名为“子”(数组)的属性
数据集:
const categories = [
{
id: 16,
name: "Cat Top Level 1",
parent: 0,
},
{
id: 17,
name: "Cat Top Level 2",
parent: 0,
},
{
id: 18,
name: "Cat Top Level 3",
parent: 0,
},
{
id: 19,
name: "Cat Top 3 Child 1",
parent: 18,
},
{
id: 20,
name: "Cat Top 3 Child 2",
parent: 18,
},
{
id: 22,
name: "Cat Top 3 Child 2 Child 1",
parent: 20,
},
{
id: 23,
name: "Cat Top 3 Child 2 Child 1 Child 1",
parent: 22,
},
{
id: 21,
name: "Cat Top 3 Child 3",
parent: 18,
},
{
id: 15,
name: "Uncategorized",
parent: 0,
},
];
到目前为止,我提出的代码是这样的
function mergeCategories(categories) {
categories.map((category) => {
category.children = [];
if (category.parent === 0) {
return;
}
categories.map((subCategory) => {
if (subCategory.id !== category.parent) {
return;
}
});
});
}
循环中的循环将返回许多重复项。我想,似乎也需要一个.filter()。由于性能原因,forEach()被排除在外
到目前为止,它还不完整,当然也不起作用。当我想到如何处理这件事时,我的脑子都快发疯了。我想这很简单。但这很难说实话。您可以使用递归方法和
reduce
方法来实现这一点,该方法将检查pid
参数是否等于当前元素的id
,如果是,则将该对象添加到累加器值中。然后还创建递归调用以获取子对象,如果找到子对象,则将它们作为子对象属性添加到当前对象中。这还要求根对象的parent
值为0
const data=[{“id”:16,“name”:“Cat Top Level 1”,“parent”:0},{“id”:17,“name”:“Cat Top Level 2”,“parent”:0},{“id”:18,“name”:“Cat Top Level 3”,“parent”:0},{“id”:19,“name”:“Cat Top 3 Child 1”,“parent”:18},{“id”:20,“name”:“Cat Top 3 Child 2”,“parent”:18},{“id”:22,“name”:“Cat Top 3 Child 2 Child 1”,“parent”:20},{“id”:23,“name”:“Cat Top 3子项2子项1子项1”,“父项”:22},{“id”:21,“名称”:“Cat Top 3子项3”,“父项”:18},{“id”:15,“名称”:“未分类”,“父项”:0}]
函数toNested(数据,pid=0){
返回数据。减少((r,e)=>{
如果(pid==e.parent){
常量对象={…e}
const children=toNested(数据,e.id);
if(儿童长度){
object.children=子对象
}
r、 推(对象)
}
返回r;
}, [])
}
const result=toNested(数据);
log(result)
有一个addChild
方法,该方法将查找父对象(递归)并附加到子对象
consttree={id:0,名称:“root”,子项:[]};
const addChild=(对象,父对象)=>{
if(obj.parent==parent.id){
parent.children.push({…obj,children:[]});
}否则{
parent.children.forEach((item)=>addChild(obj,item));
}
};
constbuildtree=(arr)=>arr.forEach(obj=>addChild(obj,tree));
const categories=[{“id”:16,“name”:“Cat Top Level 1”,“parent”:0},{“id”:17,“name”:“Cat Top Level 2”,“parent”:0},{“id”:18,“name”:“Cat Top Level 3”,“parent”:0},{“id”:19,“name”:“Cat Top 3 Child 1”,“parent”:18},{“Cat Top 3 Child 2”,“parent”:18},{“id”:22,“name”:“Cat Top 3 Child 2 Child 1”,“parent”:20},{“id”:23,“name”:Cat Top 3子项2子项1子项1,“父项”:22},{“id”:21,“名称”:“Cat Top 3子项3”,“父项”:18},{“id”:15,“名称”:“未分类”,“父项”:0}]
构建树(类别);
console.log(树);