js一层数据拆成多级分层

发布于 2022-09-30 23:07:10 字数 896 浏览 20 评论 0

如图数据结构
image.png
后台返回的数据如下:

{

"result":[
    {
        "id":101,
        "name":"助安科技",
        "orgType":0
    },
    {
        "id":10101,
        "name":"生产管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":10102,
        "name":"设备管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":1010201,
        "name":"项目1组",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":1010202,
        "name":"软件研发部",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":102,
        "name":"景安网络",
        "orgType":0,
        "parentId":0
    },
    {
        "id":10201,
        "name":"软件研发部",
        "orgType":1,
        "parentId":102
    }
]

}

也就是本来是分层级的结构后台在一层返给我了,我怎么用最简单的方法把一层的结构变成有多层关系的结构(返回如上图所示的结构)。用JS实现。

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

终遇你 2022-10-07 23:07:10

image.png

let result = [
    {
        "id":101,
        "name":"助安科技",
        "orgType":0
    },
    {
        "id":10101,
        "name":"生产管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":10102,
        "name":"设备管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":1010201,
        "name":"项目1组",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":1010202,
        "name":"软件研发部",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":102,
        "name":"景安网络",
        "orgType":0,
        "parentId":0
    },
    {
        "id":10201,
        "name":"软件研发部",
        "orgType":1,
        "parentId":102
    }
]
var i = 0;
let arrToArray = (list=[],id)=>list.reduce((acc,cur,idx,arr)=>(cur.parentId == id && (delete arr[idx]) && acc.push(Object.assign(cur,{children: arrToArray(arr,cur.id)})), acc),[])
arrToArray(result);

image.png


let result = [
    {
        "id":101,
        "name":"助安科技",
        "orgType":0
    },
    {
        "id":10101,
        "name":"生产管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":10102,
        "name":"设备管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":1010201,
        "name":"项目1组",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":1010202,
        "name":"软件研发部",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":102,
        "name":"景安网络",
        "orgType":0,
        "parentId":0
    },
    {
        "id":10201,
        "name":"软件研发部",
        "orgType":1,
        "parentId":102
    }
]

let arrToArray = (list=[],id)=>list.filter(item=>item.parentId == id).map(item=>Object.assign(item,{children: arrToArray(list,item.id)}))
arrToArray(result);

image.png
这个方法性能最好,只需遍历两次
https://wintc.top/article/8

let result = [
    {
        "id":101,
        "name":"助安科技",
        "orgType":0
    },
    {
        "id":10101,
        "name":"生产管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":10102,
        "name":"设备管理部",
        "orgType":1,
        "parentId":101
    },
    {
        "id":1010201,
        "name":"项目1组",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":1010202,
        "name":"软件研发部",
        "orgType":2,
        "parentId":10102
    },
    {
        "id":102,
        "name":"景安网络",
        "orgType":0,
        "parentId":0
    },
    {
        "id":10201,
        "name":"软件研发部",
        "orgType":1,
        "parentId":102
    }
]
function listToTree(srcList) {
  let result = []
  // reduce收集所有节点信息存放在对象中,可以用forEach改写,不过代码会多几行
  let nodeInfo = srcList.reduce((data, node) => (data[node.id] = node, data), {})

 // forEach给所有元素找妈妈
  srcList.forEach(node => {
    if (!node.parentId) {
      result.push(node)
      return
    }
    let parent = nodeInfo[node.parentId]
    if(parent) {
      parent.children = parent.children || []
      parent.children.push(node)
    }
  })
  return result
}
listToTree(result);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文