NodeJs递归遍历

ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(一个人的激情和理想越多,就越幸福。 —— 夏洛特·凯瑟琳)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ在这里插入图片描述

const arr = [
  {
    "id": 0,
    "name": "公司",
    "parent_id": -1
  },
  {
    "id": -2,
    "name": "行政",
    "parent_id": 0
  },
  {
    "id": -3,
    "name": "产品",
    "parent_id": 0
  },
  {
    "id": -4,
    "name": "产品运营",
    "parent_id": -3
  },
  {
    "id": 1,
    "name": "客服",
    "parent_id": 0
  },
  {
    "id": 2,
    "name": "运维",
    "parent_id": 0
  },
  {
    "id": 3,
    "name": "销售部",
    "parent_id": 0
  },
  {
    "id": 4,
    "name": "研发",
    "parent_id": 0
  },
  {
    "id": 5,
    "name": "前端",
    "parent_id": 4
  },
  {
    "id": 6,
    "name": "后端",
    "parent_id": 4
  },
  {
    "id": 7,
    "name": "架构",
    "parent_id": 6
  },
  {
    "id": 8,
    "name": "数据库",
    "parent_id": 6
  },
  {
    "id": 9,
    "name": "开发",
    "parent_id": 6
  }
];


// 先找到根节点
let root = null;
for (var i = 0; i < arr.length; i++) {
  // 获取父节点id
  const parent_id = arr[i].parent_id;
  // 判断当前节点是否能找到父节点
  const isChildren = arr.some((v) => v.id === parent_id);
  // 找不到则证明是根节点
  if (!isChildren) {
    root = arr[i];
    break;
  }
}

const loop = (node) => {
  // 获取节点id
  const nodeId = node.id;
  // 找到该节点的子节点列表
  const childernList = arr.filter((v) => v.parent_id === nodeId);
  // 如果没有子节点则不进行处理
  if (!childernList.length > 0) {
    return;
  }
  // 如果有子节点,则将子节点复制给该节点的children
  node.children = childernList;
  // 然后继续递归子节点,找子节点的
  for (var i = 0; i < childernList.length; i++) {
    loop(childernList[i]);
  }
};
loop(root);
console.log(JSON.stringify(root));
{
    "id":0,
    "name":"公司",
    "parent_id":-1,
    "children":[
        {
            "id":-2,
            "name":"行政",
            "parent_id":0
        },
        {
            "id":-3,
            "name":"产品",
            "parent_id":0,
            "children":[
                {
                    "id":-4,
                    "name":"产品运营",
                    "parent_id":-3
                }
            ]
        },
        {
            "id":1,
            "name":"客服",
            "parent_id":0
        },
        {
            "id":2,
            "name":"运维",
            "parent_id":0
        },
        {
            "id":3,
            "name":"销售部",
            "parent_id":0
        },
        {
            "id":4,
            "name":"研发",
            "parent_id":0,
            "children":[
                {
                    "id":5,
                    "name":"前端",
                    "parent_id":4
                },
                {
                    "id":6,
                    "name":"后端",
                    "parent_id":4,
                    "children":[
                        {
                            "id":7,
                            "name":"架构",
                            "parent_id":6
                        },
                        {
                            "id":8,
                            "name":"数据库",
                            "parent_id":6
                        },
                        {
                            "id":9,
                            "name":"开发",
                            "parent_id":6
                        }
                    ]
                }
            ]
        }
    ]
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值