Javascript 仅具有父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

父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 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(树);