js 处理树形数据

本文介绍两种将扁平化的数据转换为树形结构的方法。第一种方法通过递归地检查每个节点的父节点ID来构建层级关系,并标记层级深度。第二种方法使用函数式编程方式,通过查找具有相同父ID的子项来动态填充子节点列表。
摘要由CSDN通过智能技术生成
  1. 方案一

export const generateTree = (data, id = 'id', parentId = 'parentId') => {
  var result = [];
  var idMap = {};
  for (var i = 0; i < data.length; i++) {
    idMap[data[i][id]] = data[i];
  }
  for (var i = 0; i < data.length; i++) {
    if (idMap[data[i][parentId]] && data[i][id] !== data[i][parentId]) {
      if (!idMap[data[i][parentId]]['children']) {
        idMap[data[i][parentId]]['children'] = [];
      }
      if (!idMap[data[i][parentId]]['_level']) {
        idMap[data[i][parentId]]['_level'] = 1;
      }
      data[i]['_level'] = idMap[data[i][parentId]]._level + 1;
      idMap[data[i][parentId]]['children'].push(data[i]);
    } else {
      result.push(data[i]);
    }
  }
  return result;
}
  1. 方案二

const getChildren = (data) => {
  return function (item) {
    const arr = [];
    data.forEach((value) => {
      if (value.pId === item.id) {
        arr.push(value);
      }
    });
    return arr;
  };
};

export const generateTree = (data) => {
  const arr = [];
  data.map((item) => {
    const list = getChildren(data)(item);
    if (list.length > 0) {
      item["children"] = list;
    }
    if (item.pId === 0) {
      arr.push(item);
    }
  });
  return arr;
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值