nodejs 平面数据转换成树形结构

不知道算不算递归函数,想写递归又憋不出来,目前只能做出来两层的树形结构

一、处理成两层树形

先处理两层,第三层数据日后再做。

 要处理的数据如下:

const items = [
    { id: 1, parentId: null, name: 'Item 1' },
    { id: 2, parentId: 1, name: 'Item 1.1' },
    { id: 3, parentId: 1, name: 'Item 1.2' },
    { id: 4, parentId: 2, name: 'Item 1.1.1' },
    { id: 5, parentId: null, name: 'Item 2' }
  ];

处理的方法:

function find(id,params) {
    var arry = []
    for (let i = 0; i < params.length; i++) {
      const element = params[i]
      if (!element.parentId) {
        element.children = []
        id = element.id
        arry.push(element)
      }
      childr(id,element,params)
    }
    return arry
  }
  function childr(id,list,params) {
    if(list.parentId == id){
      var ids = id-1
      // console.log("level2",list,id)
      items[ids].children.push(list)
    }
  }
  var tree = find(0,items)
    console.log(tree)

我的思路是:先遍历 if判断根节点,在根节点下面添加children[]存放子节点,不是根节点传递pid匹配到根节点然后存放到children中。

代码详解:

第一步:find()函数就是将所要处理的数据(items)中的根节点遍历出来然后加上children数组进行存放子节点,这里的id的id取的是items中的id,其实直接取每个map的index会比较好。新建一个数组存放各个根节点,最后将这个数组返回。

第二步:在遍历过程中会将子节点也遍历出来,用chidr()函数处理子节点将子节点按照对应的层级存放到根节点中。

最终效果:

[
[0]   {
[0]     id: 1,
[0]     parentId: null,
[0]     name: 'Item 1',
[0]     children: [ [Object], [Object] ]
[0]   },
[0]   { id: 5, parentId: null, name: 'Item 2', children: [] }
[0] ]

二、处理成多层

来源:问AI问出来的

处理的数据:

const items = [
      { id: 1, parentId: null, name: 'Item 1' },
      { id: 2, parentId: 1, name: 'Item 1.1' },
      { id: 3, parentId: 1, name: 'Item 1.2' },
      { id: 4 ,parentId: 6, name: 'item 2.1'},
      { id: 5, parentId: 2, name: 'Item 1.1.1' },
      { id: 6, parentId: null, name: 'Item 2' },
    ];

方法:

function listToTree(list) {
      let map={} ,node , tree=[],i;
      for (let i = 0; i < list.length; i++) {
        map[list[i].id] = i
        list[i].children = []
        // console.log("初始化映射:", map)
        // console.log("添加children:",list)
      }
      console.log(map)
      for (let i = 0; i < list.length; i++) {
        node = list[i]
        if(!node.parentId){
          tree.push(node)
        }else{
          list[map[node.parentId]].children.push(node)
          
          console.log("??",list[map[node.parentId]] , node.parentId,map[node.parentId])
        }
      }
      return tree
    }
    var trees = listToTree(items)
    //console.log('树形结构:',trees)

第一步:先做一个映射的关系,把平面数据中的id和它的索引做成映射关系,以及把平面数组中的每一个节点都加上children数组;最终map打印的数据是: { '1': 0, '2': 1, '3': 2, '4': 3, '5': 4, '6': 5 },key对应的是items.id ,value对应的是index(索引);

第二步:对list数据进行处理,for循环遍历的过程中进行if判断,如果parentId是null的话就是根节点了,反之是子节点。list[map[node.parentId]]:node.parentId 是遍历过程中其中一个非根节点的id,map[node.parentId]在map映射中找到对应的索引,在通过该索引确定在哪个节点下面。

最终返回数据:

 [
        {
            "id": 1,
            "parentId": null,
            "name": "Item 1",
            "children": [
                {
                    "id": 2,
                    "parentId": 1,
                    "name": "Item 1.1",
                    "children": [
                        {
                            "id": 5,
                            "parentId": 2,
                            "name": "Item 1.1.1",
                            "children": []
                        }
                    ]
                },
                {
                    "id": 3,
                    "parentId": 1,
                    "name": "Item 1.2",
                    "children": []
                }
            ]
        },
        {
            "id": 6,
            "parentId": null,
            "name": "Item 2",
            "children": [
                {
                    "id": 4,
                    "parentId": 6,
                    "name": "item 2.1",
                    "children": []
                }
            ]
        }
    ]

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值