This question already has answers here:
Build tree array from flat array in javascript
                                
                                    (27个答案)
                                
                        
                        
                            Building tree array of objects from flat array of objects
                                
                                    (2个答案)
                                
                        
                6个月前关闭。
            
        

我有以下来自API的数据:

[
  {
    "Code": "01002",
    "ParentAccountId": "01",
  },
  {
    "Code": "01001001003",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "01001004",
    "ParentAccountId": "01001",
  },
  {
    "Code": "02",
    "ParentAccountId": null,
  },
  {
    "Code": "01002001",
    "ParentAccountId": "01002",
  },
  {
    "Code": "02002",
    "ParentAccountId": "02",
  },
  {
    "Code": "02001",
    "ParentAccountId": "02",
  },
  {
    "Code": "01001001001",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "03",
    "ParentAccountId": null,
  },
  {
    "Code": "01002002",
    "ParentAccountId": "01002",
  },
  {
    "Code": "03001",
    "ParentAccountId": "03",
  },
  {
    "Code": "01",
    "ParentAccountId": null,
  },
  {
    "Code": "01001001002",
    "ParentAccountId": "01001001",
  },
  {
    "Code": "01001002",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001001",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001003",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001005",
    "ParentAccountId": "01001",
  },
  {
    "Code": "01001",
    "ParentAccountId": "01",
  }
]


查看ParentAccountId

由于需要将其传递给treeview组件,因此需要将其转换为以下形式:

    [
  {
    "Code": "01",
    "ParentAccountId": null,
    "children": [
        {
            "Code": "01001",
            "ParentAccountId": "01",
            "children": [
                  {
                    "Code": "01001001",
                    "ParentAccountId": "01001",
                    "children": [
                        {
                            "Code": "01001001001",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                        {
                            "Code": "01001001002",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                          {
                            "Code": "01001001003",
                            "ParentAccountId": "01001001",
                            "children": [],
                          },
                    ],
                  },
                {
                    "Code": "01001002",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001003",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001004",
                    "ParentAccountId": "01001",
                    "children": [],
                  },
                  {
                    "Code": "01001005",
                    "ParentAccountId": "01001",
                    "children": [],
                  }
            ],
          },
        {
            "Code": "01002",
            "ParentAccountId": "01",
            "children": [
                {
                    "Code": "01002001",
                    "ParentAccountId": "01002",
                    "children": [],
                  },
                {
                    "Code": "01002002",
                    "ParentAccountId": "01002",
                    "children": [],
                  },
            ],
          },
    ],
  },
  {
    "Code": "02",
    "ParentAccountId": null,
    "children": [
          {
            "Code": "02001",
            "ParentAccountId": "02",
            "children": [],
          },
        {
            "Code": "02002",
            "ParentAccountId": "02",
            "children": [],
          },
    ],
  },
  {
    "Code": "03",
    "ParentAccountId": null,
    "children": [
        {
            "Code": "03001",
            "ParentAccountId": "03",
            "children": [],
          },
    ],
  },
]


我想根据code将对象作为其父项的子项。该方案是,如果ParentAccountId为null,则它是顶级父级;如果ParentAccountId的长度为2,则它是第一级子级;如果ParentAccountId的长度是5,则它是第三级子级,然后是的长度为8,那么它是4级子级,然后ParentAccountId的长度为11,然后是5级子级。由于第一级子级具有2个长度的ParentAccountId,因此后续子级的ParentAccountId作为父级加号的ParentAccountId。对于更好的理解,请参阅第二篇,因为我的英语水平没有那么好。

我对逻辑感到困惑。有什么建议么?

最佳答案

您可以使用reduce方法创建树结构来创建递归函数,在该递归函数中,您在每次迭代中都要检查父ID是否等于当前元素ID。



const data = [{"Id":"1","Code":"01","Title":"Account 01","ParentAccountId":null},{"Id":"2","Code":"02","Title":"Account 02","ParentAccountId":null},{"Id":"3","Code":"01001","Title":"Account 01001","ParentAccountId":"01"},{"Id":"4","Code":"01002","Title":"Account 01002","ParentAccountId":"01"},{"Id":"5","Code":"01002001","Title":"Account 01002001","ParentAccountId":"01002"}]

function toTree(data, pid = null) {
  return data.reduce((r, e) => {
    if (e.ParentAccountId == pid) {
      const obj = { ...e };
      const children = toTree(data, e.Code);
      if (children.length) obj.children = children;
      r.push(obj);
    }
    return r;
  }, [])
}

const result = toTree(data)
console.log(result)

关于javascript - 根据父ID JavaScript将对象设为子对象,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/58492213/

10-09 17:04