Array(数组-转树)

45 篇文章 1 订阅
8 篇文章 1 订阅
// id:唯一值,pid:父级id

  var zNodes = [
    { id: 1, name: 'SeriousLose Home', pid: 0 },
    { id: 2, name: 'SeriousLose in Google', pid: 0 },
    { id: 3, name: 'SeriousLose in ShangHai', pid: 1 },
  ];
  function buildTree(arr) {
    let temp = {};
    let tree = {};
    // 数组转 键值对
    arr.forEach((item) => {
      temp[item.id] = item;
    });
    let tempKeys = Object.keys(temp);
    tempKeys.forEach((key) => {
      let item = temp[key]; // 获取当前项
      let _itemPId = item.pid; // 当前项 父级pid
      let parentItemByPid = temp[_itemPId]; // 获取父级项
      if (parentItemByPid) {
        if (!parentItemByPid.children) {
          parentItemByPid.children = [];
        }
        parentItemByPid.children.push(item);
      } else {
        tree[item.id] = item; // 无父级时
      }
    });
    // 对象转数组并返回
    return Object.keys(tree).map((key) => tree[key]);
  }
  let treeAry = buildTree(zNodes);
  console.log(treeAry);
// 通过双层filter过滤的方式实现;

  const list = [
    { id: 1, name: '一级 1', pid: 0 },
    { id: 2, name: '二级 1-1', pid: 1 },
    { id: 3, name: '二级 1-2', pid: 1 },
    { id: 4, name: '三级 1-1-1', pid: 2 },
    { id: 5, name: '一级 2', pid: 0 },
  ];

  function listToTree(list) {
    return list.filter((e) => {
      let pid = e.pid;
      let newArr = list.filter((ele) => {
        if (ele.id == pid) {
          if (!ele.children) {
            ele.children = [];
          }
          ele.children.push(e);
          return true;
        }
      });
      return newArr.length === 0;
    });
  }
  listToTree(list);
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值