【小算法】将数组处理成树状结构

9,832次阅读
没有评论

共计 1492 个字符,预计需要花费 4 分钟才能阅读完成。

前言

将数组处理成树状结构,也是在工作中经常遇到的,今天就和大家一起分享一下思路和方法。

案例

如下代码,处理成树状结构,要求程序具有容错能力,也就是可以判断输入出错。

let haoroomsDataArr = [{ id: 1, name: "haorooms1"},
  {id: 2, name: "haorooms2", parentId: 1},
  {id: 4, name: "haorooms4", parentId: 3},
  {id: 3, name: "haorooms3", parentId: 2},
  {id: 8, name: "haorooms18", parentId: 7},
];

思路

要求处理成树状结构,那么肯定有根节点,从根节点延伸出对应的 children, 然后再看子节点是否有子节点。

1、首先找出根节点,没有 parentId 的就是根节点

2、有父节点的均为子节点,根据关联的父节点,设置到一个父节点的对象数组中。3、针对同一个父节点的子节点数组,因为关联的父节点是惟一的。可以把父节点作为键,所有子节点放到键值对中。4、根据节点的 id, 查找以节点 id 为建的 children 数组,递归查找是否都有子节点,没有就是 leaf 节点,或者 children 为 null

异常

1、父节点不存在

2、无子节点(叶子节点)

代码

function getTree(arr) {if (!arr || !Array.isArray(arr)) return "错误的数据类型";
  var len = arr.length;
  if (!len) return "空数组";
  var rootObj = {id: null, name: null, children: [] };
  var nodeObj = {};
  for (var i = 0; i  0) {for (var i = 0; i 

方法二

const buildTree = (data, config = {}) => {if (!data || !Array.isArray(data)) return "错误的数据类型";
  const len = data.length;
  if (!len) return "空数组";
  const id = (config && config.id) || "id";
  const pid = (config && config.pid) || "parentId";
  const children = (config && config.children) || "children";

  // 把所有的 ID 映射为一个 map 方便查询
  const idMap = {};
  // 找到父节点的放入 treeData
  const treeData = [];
  // 节点包含 pid 属性, 并且父节点不存在的放入 errorData
  const errorData = [];

  data.forEach((v) => {v && (idMap[v[id]] = v);
  });

  data.forEach((v) => {if (v) {let parent = idMap[v[pid]];
      if (parent) {!parent[children] && (parent[children] = []);
        parent[children].push(v || []);
      } else if (!parent && v.hasOwnProperty(pid)) {errorData.push(v);
      } else {treeData.push(v);
      }
    }
  });
  // 树结构 错误数据同时返回
  // return {
  //   treeData,
  //   errorData
  // }
  // 只返回树结构
  return treeData;
};

B 站推荐视频推荐

本人开通了 B 站账号,定期更新前端视频,欢迎关注!

1、js 的 proto 和 prototype 区别

2、秒懂 js 的 constructor

    正文完
     0
    Yojack
    版权声明:本篇文章由 Yojack 于1970-01-01发表,共计1492字。
    转载说明:
    1 本网站名称:优杰开发笔记
    2 本站永久网址:https://yojack.cn
    3 本网站的文章部分内容可能来源于网络,仅供大家学习与参考,如有侵权,请联系站长进行删除处理。
    4 本站一切资源不代表本站立场,并不代表本站赞同其观点和对其真实性负责。
    5 本站所有内容均可转载及分享, 但请注明出处
    6 我们始终尊重原创作者的版权,所有文章在发布时,均尽可能注明出处与作者。
    7 站长邮箱:laylwenl@gmail.com
    评论(没有评论)