扁平化与树形处理-reduce的应用

扁平化数组到树形数组

递归处理:

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    let data = [
      {
        id:2,
        name:'yuyu',
        pid:0,
      },
      {
        id:3,
        name:'yuyu',
        pid:2,
      },
      {
        id:4,
        name:'yuyu',
        pid:3,
      },
      {
        id:5,
        name:'yuyu',
        pid:4,
      },
    ]
    console.log(formatTree(data))

    //树形结构化
    function formatTree(data){
      let parent = data.filter(p => p.pid === 0)
      let children = data.filter(p => p.pid !== 0)

      dataTree(parent,children)
      return parent

      function dataTree(parent,children){
        parent.forEach(p => {
          children.forEach((c,i) => {
            if (p.id === c.pid) {
              let _c = JSON.parse(JSON.stringify(children))
              _c.splice(i,1)
              dataTree([c],_c)
              if(p.children){
                p.children.push(c)
              }else {
                p.children = [c]
              }
            }
          })
        });
      }
    }
  </script>
</body>
</html>

方法二 不递归

 // 方法二 不递归
function formatTree2(data){
  return data.filter(p => {
    let children = data.filter(c => p.id === c.pid)
    children.length && (p.children = children)
    return p.pid === 0
  })
}

树形数组扁平化处理--以及reduce的其他用法-提取属性-整理属性

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>Document</title>
</head>
<body>
  <script>
    let treeArr =[2,3,[1,2,3],[3,4,[5,6,[7,8,3]]]]

    // console.log('flat', treeArr.flat(Infinity))  
    // console.log('toString', treeArr.toString().split(',').map( x => x*1))  
    let treeData = [
      {
        id:1,
        name: 'yuyu',
        children:[
          {
            id:2,
            name:'y',
            children:[
              {
                id:4,
                name:'y',
                children:[
                  {
                    id:15,
                    name:'y',
                    children:[
                      {
                        id:6,
                        name:'y',
                        children:[
                          {
                            id:17,
                            name:'y',
                          }
                        ]
                      }
                    ]
                  }
                ]
              }
            ]
          },
          {
            id:3,
            name:'y'
          },
        ]
      }
    ]
  

    let flat = toFlat(treeData)
    // console.log(toFlat(treeData))

    // 扁平化
    function toFlat(tree){
      return tree.reduce(function(pre ,curr){
        pre.push({
          id: curr.id,
          name: curr.name,
          parentId: curr.parentId || '无'
        })

        if(curr.children){
          curr.children.forEach(c => {
            c.parentId = curr.id
            arguments.callee(pre,c)
          });
        }
        return pre
      },[])
    }

    // 提取id
    function flatId(flat){
      return flat.reduce((pre,curr)=>{
        pre['id is '+curr.id] = curr
        return pre
      },{})
    }
    
    // console.log('flatId(flat)', flatId(flat))

    // 整理属性
    function collateProperty(flat){
      return flat.reduce((pre,curr)=>{
        let i = pre.findIndex((value)=> value.name === curr.name)
        if(i>-1){
          pre[i].list.push(curr)
        }else{
          pre.push({
            name:curr.name,
            list:[curr]
          })
        }
        return pre
      },[])
    }

    console.log('collate(flat)', collateProperty(flat))

    
  
  </script>
</body>
</html>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值