首页 > 其他分享 >js 树的各种骚操作,生成树,父子链,树推平

js 树的各种骚操作,生成树,父子链,树推平

时间:2022-11-04 08:57:16浏览次数:99  
标签:推平 pid deep js 父子 children key data id

js生成树结构

1、假树,利用共享内存实现,非真遍历,这个是一种比较直观的写法

      let list = [
        {id:1,name:100},
        {id:11,name:101,pid:1},
        {id:111,name:1011,pid:11},
        {id:2,name:200},
        {id:22,name:202,pid:2},
        {id:3,name:3002},
        {id:32,name:3003,pid:1},
        {id:42,name:4003,pid:111}
      ]
      let mapList = list.reduce((prev,v)=>{
        prev[v.id]=v
        return prev
      },[])
      let tree = list.reduce((prev,v)=>{
        if(!mapList[v.pid]){
          v.children?'':(v.children=[])
          prev=[...prev,...[v]]
        }else{
          mapList[v.pid].children?'':(()=>mapList[v.pid].children=[])()
          mapList[v.pid].children=[...mapList[v.pid].children,...[v]]
        }
        return prev
      },[])
      console.log(mapList);
      console.log(tree);

2.假树, 同第一种原理,非直观写法,是不是简便多了

 let tree = list.map(v=>{
        v.children?'':(()=>v.children=[])()
        v.pid?'':(()=> v.type='parent')()
        v.children = list.filter(m=>m.pid===v.id)
        return v
      }).filter(v=>v.type==='parent')
      console.log(list);
      console.log(tree);

级联数据拉平
  //级联数据拉平
function  flatArray(key,deep,arr){
    const readNodes =  function(key,deep,arr,data=[]){
      for (let item of arr) {
          data.push(item)
          if (item[deep] && item[deep].length){
            readNodes(key,deep,item[deep],data)
          }
       }
       return data
    }
    return readNodes(key,deep,arr)
  }
flatArray('id','children',list)
返回父子链
function findParent(value,key,parent,deep,arr1=[]){
  let readNodes = (value,key,parent,deep,arr,data=[])=>{
    for(let v of arr){
      if(!value) break
      if(v[key]===value){
        data.unshift(v)
        readNodes(v[parent],key,parent,deep,arr1,data)
        break
      }else{
        v[deep]&&v[deep].length?readNodes(value,key,parent,deep,v[deep],data):''
      }
    }
    return data
  }
  return readNodes(value,key,parent,deep,arr1)
}

console.log(findParent(111,'id','pid','children',tree));

作者:沧桑岁月歌
链接:https://www.jianshu.com/p/59a941b5bd8e
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

标签:推平,pid,deep,js,父子,children,key,data,id
From: https://www.cnblogs.com/Sultan-ST/p/16856517.html

相关文章

  • 【JS基础】关于JS能表示的最大精度的问题
    看了好多文章,我还是比较认可这位博主的说法:https://www.codercto.com/a/107226.html本文只是自己做记录,是篇水文,大家可以直接访问上面链接哦~根据 IEEE754 标准,有......
  • JS(二)
    1.DOM1.1改变HTMLHTMLDOM允许JavaScript改变HTML元素的内容。可用于直接向HTML输出流写内容。document.getElementById("").innerHTML=新的HTML用于修改变......
  • 用Nodejs 实现一个简单的 Redis客户端
    目录0.写在前面1.背景映入2.数据库选择3.NodejsTCP连接3.代码编写4.实验5.wireshark抓包分析6.杂与代码0.写在前面大家如果有去看过nodejs所支持的官方库的......
  • nodejs 密码加密
    1.新建了一个setPassword.js文件constcrypto=require("crypto");///导入加密模块functionsetPassword(pwd){letpassword=`${pwd}xxx`//加入一段特定字符......
  • JS中的pipe原理
    学习reduce()时遇到一个练习“功能型函数管道”,对于代码中的pipe不能理解,类似于下面这一行代码,信息量很丰富,有es6中的扩展运算符,箭头函数,reduce()方法。constpipe=(........
  • js基础01
    ExerciseTest01严格检查模式strict'usestrict';//预防js的随意性导致产生的一些问题,必须放在第一行leti=1;//局部变量建议都用let定义数据类型数......
  • 解决本地浏览器运行项目时的跨域问题-Access to XMLHttpRequest at ‘file:///D:/WebP
     解决本地浏览器运行项目时的跨域问题-AccesstoXMLHttpRequestat'file:///D:/WebPracties/xxxxxx/data/funData.json问题描述解决办法一解决办法二解决方法三问题描......
  • Controller输出JSON数据 乱码解决方案
    ​我们可以在springmvc的配置文件上添加一段消息StringHttpMessageConverter转换配置!<mvc:annotation-driven><mvc:message-convertersregister-defaults="true">......
  • js延迟加载、js异步加载
    1.js延迟加载(1)js延迟加载是js性能优化的一种方式(2)作用:为了提高网页的加载速度(3)原理:等网页加载完成之后再加载js文件··需要优化的原因:HTML元素......
  • js数组操作——对象数组根据某个相同的字段分组
    先说点废话最近在实际业务中,需要编写一个方法根据数组中每一个对象的一个相同字段,来将该字段值相等的对象重新编入一个数组,返回一个嵌套的数组对象,特地来做个总结。当然......