算法合集

福尔摩斯对我笑 2019-07-05 185 次 3条

树形结构反向解析

现有json结构如下:

  var objs = {
      id: 1,
      name: "第一个分组",
      pid: 0,
      label: "第一个分组",
      children: [
        {
          id: 3,
          name: "第一个分组的子分组",
          pid: 1
        },
        {
          id: 4,
          name: "第一个分组的第二个子分组",
          pid: 1,
          children: [
            {
              id: 5,
              name: "第一个分组的第二个子分组的第一个子分组",
              pid: 4,

              children: [
                {
                  id: 6,
                  name: "第一个分组的第二个子分组的第一个子分组的第一个分组",
                  pid: 4
                }
              ]
            }
          ]
        }
      ]
    };
    

需要的格式


[    {
        "id":3,
        "name":"第一个分组的子分组"
    },    {
        "id":4,
        "name":"第一个分组的第二个子分组"
    },    {
        "id":5,
        "name":"第一个分组的第二个子分组的第一个子分组"
    },    {
        "id":6,
        "name":"第一个分组的第二个子分组的第一个子分组的第一个分组"
    },    {
        "id":1,
        "name":"第一个分组"
    }]
    

算法

function toTreeData(objs) {
  var temp = [];
  var forFn = function(arr) {
      for (var i = 0; i < arr.length; i++) {
        var item = arr[i];
        temp.push({
          id: item.id,
          name: item.name
        });

        //如果有子元素进入递归
        if (item.children) {
          forFn(item.children);
        }
      }
    };


  if (objs.children) {
    forFn(objs.children);
  }

  temp.push({
    id: objs.id,
    name: objs.name
  });

  return temp;
}


var treeData = toTreeData(objs);
console.log(treeData);   //结束

根据最后一个找到整个家族


familyTree(arr, pid) {
var temp = [];
var forFn = function(arr, pid) {
for (var i = 0; i < arr.length; i++) {
var item = arr[i];
if (item.id == pid) {
temp.push(item);
forFn(arr, item.pid);
}
}
};
forFn(arr, pid);
return temp;
}


找到某一父节点下的所有子节点

 sonsTree(arr, id) {
      var temp = [],
        lev = 0;
      var forFn = function(arr, id, lev) {
        for (var i = 0; i < arr.length; i++) {
          var item = arr[i];
          if (item.pid == id) {
            item.lev = lev;
            temp.push(item);
            forFn(arr, item.id, lev + 1);
          }
        }
      };
      forFn(arr, id, lev);
      return temp;
    }

将数据写成树结构

toTree(data) {
      // 删除 所有 children,以防止多次调用
      data.forEach(function(item) {
        delete item.children;
      });
 
      // 将数据存储为 以 id 为 KEY 的 map 索引数据列
      var map = {};
      data.forEach(function(item) {
        map[item.id] = item;
      });
      //        console.log(map);
 
      var val = [];
      data.forEach(function(item) {
        // 以当前遍历项,的pid,去map对象中找到索引的id
        var parent = map[item.pid];
 
        // 如果找到索引,那么说明此项不在顶级当中,那么需要把此项添加到,他对应的父级中
        if (parent) {
          (parent.children || (parent.children = [])).push(item);
        } else {
          //如果没有在map中找到对应的索引ID,那么直接把 当前的item添加到 val结果集中,作为顶级
          val.push(item);
        }
      });
      return val;
    },

标签: 无

非特殊说明,本博所有文章均为博主原创。

头像也是LOGO
未来博客 博主大人
到了这个年纪,不应该再彷徨!

发表评论



 


已有 3 条评论 1


  1. 凌云

    老大,这个模板能分享吗?

    回复 2019年7月10日
    • 福尔摩斯对我笑

      怎么分享

      回复 2019年7月10日
  2. 天命

    fdsafdafsdafd

    回复 2019年7月10日