前端数组变树结构

转自:https://www.jianshu.com/p/639856724e92

        arrayToTree(data) {
            let result = [];
            if (!Array.isArray(data)) {
                return result;
            }
            // 清除已存在的children 重新赋值
            data.forEach(item => {
                delete item.children;
            });

            let map = {};
            data.forEach(item => {
                map[item.deptId] = item;
            });

            data.forEach(item => {
                let parent = map[item.pDeptId];
                if (parent) {
                    (parent.children || (parent.children = [])).push(item);
                } else {
                    result.push(item);
                }
            });
            return result;
        },

var transObject = function(tableData, keys) {
  let hashTable = {}, res = []
  for (let i = 0; i < tableData.length; i++) {
    let arr = res, cur = hashTable
    for (let j = 0; j < keys.length; j++) {
      let key = keys[j], filed = tableData[i][key]
      if (!cur[filed]) {
        let pusher = {
          value: filed
        }, tmp
        if (j !== (keys.length - 1)) {
          tmp = []
          pusher.children = tmp
        }
        cur[filed] = { $$pos: arr.push(pusher) - 1 }
        cur = cur[filed]
        arr = tmp
      } else {
        cur = cur[filed]
        arr = arr[cur.$$pos].children
      }
    }
  }
  return res
}
var data = [{
  "province": "浙江",
  "city": "杭州",
  "name": "西湖"
}, {
  "province": "四川",
  "city": "成都",
  "name": "锦里"
}, {
  "province": "四川",
  "city": "成都",
  "name": "方所"
}, {
  "province": "四川",
  "city": "阿坝",
  "name": "九寨沟"
}]

var keys = ['province', 'city', 'name']

console.log(transObject(data, keys))
//返回值:
[
    {
        "value": "浙江",
        "children": [
            {
                "value": "杭州",
                "children": [
                    {
                        "value": "西湖"
                    }
                ]
            }
        ]
    },
    {
        "value": "四川",
        "children": [
            {
                "value": "成都",
                "children": [
                    {
                        "value": "锦里"
                    },
                    {
                        "value": "方所"
                    }
                ]
            },
            {
                "value": "阿坝",
                "children": [
                    {
                        "value": "九寨沟"
                    }
                ]
            }
        ]
    }
]

function getSortOutList(data){
        let newObj = {}
        data.forEach((item, index) => {
          // 解构出每一个对象里面type字段的值
          let { type } = item
          // 如果在这个新对象里面没有找到,则新增一个对象
          if (!newObj[type]) {
            // 重构对象
            newObj[type] = {
              type,
              children: [],
            }
          }
          // 如果在对象里面找到有相同的 type 字段的值,则Push进入children里面
          newObj[type].children.push(item)
        })
        let newArr = Object.values(newObj)
        return newArr
      
}
// 可以配合循环归类出你想要的字段 比如type相同的数据合并成一个children
let testObj = [
        { type: '测试1', name: '小橙', age: '18', height: '177' },
        { type: '测试1', name: '小W', age: '11', height: '177' },
        { type: '测试2', name: '小E', age: '12', height: '177' },
        { type: '测试3', name: '小R', age: '13', height: '177' },
        { type: '测试2', name: '小T', age: '14', height: '177' },
        { type: '测试3', name: '小Y', age: '19', height: '177' },
        { type: '测试4', name: '小U', age: '20', height: '177' },
      ]
      const list = getSortOutList(testObj)
      console.log('测试数据', list) 

在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

*阿漓*

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值