递归生成树形结构

  1. export function getTreeData(data, pid, pidName = 'parentId', idName = 'id', childrenName = 'children', key) {
  2. let arr = [];
  3. for (let i = 0; i < data.length; i++) {
  4. if (data[i][pidName] == pid) {
  5. data[i].key = data[i][idName];
  6. data[i][childrenName] = getTreeData(data, data[i][idName], pidName, idName, childrenName);
  7. arr.push(data[i]);
  8. }
  9. }
  10. return arr;
  11. }

遍历树节点

  1. export function foreachTree(data, childrenName = 'children', callback) {
  2. for (let i = 0; i < data.length; i++) {
  3. callback(data[i]);
  4. if (data[i][childrenName] && data[i][childrenName].length > 0) {
  5. foreachTree(data[i][childrenName], childrenName, callback);
  6. }
  7. }
  8. }

追溯父节点

  1. export function traceParentNode(pid, data, rootPid, pidName = 'parentId', idName = 'id', childrenName = 'children') {
  2. let arr = [];
  3. foreachTree(data, childrenName, (node) => {
  4. if (node[idName] == pid) {
  5. arr.push(node);
  6. if (node[pidName] != rootPid) {
  7. arr = arr.concat(traceParentNode(node[pidName], data, rootPid, pidName, idName));
  8. }
  9. }
  10. });
  11. return arr;
  12. }

寻找所有子节点

  1. export function traceChildNode(id, data, pidName = 'parentId', idName = 'id', childrenName = 'children') {
  2. let arr = [];
  3. foreachTree(data, childrenName, (node) => {
  4. if (node[pidName] == id) {
  5. arr.push(node);
  6. arr = arr.concat(traceChildNode(node[idName], data, pidName, idName, childrenName));
  7. }
  8. });
  9. return arr;
  10. }

根据pid生成树形结构

  1. /**
  2. * @param { object } items 后台获取的数据
  3. * @param { * } id 数据中的id
  4. * @param { * } link 生成树形结构的依据
  5. */
  6. export const createTree = (items, id = null, link = 'pid') =>{
  7. items.filter(item => item[link] === id).map(item => ({ ...item, children: createTree(items, item.id) }));
  8. };