JavaScript 扁平化数组转成Tree

        有时候我们得到的数据结构并不是想要的,这个时候就需要对得到的数据进行处理了。比如,我们拿到的是扁平化的数组, 但我们要应用在 tree 树形组件或级联选择器组件中,这样的组件要求数据结构是具有层级递进关系的 tree 结构,或者我们并不需要层级递进的数据,那就要把它做扁平化处理了。

 扁平化数组 => Tree

        我们得到的数据是这个样子的,没有层级关系

var list = [
    {'name':'基本概括','pid':1,'id':11},
    {'name':'基本介绍','pid':11,'id':111},
    {'name':'基本经理','pid':111,'id':1111},
    {'name':'基本回报','pid':1,'id':12},
    {'name':'业绩表现','pid':12,'id':112}
]

        但我们需要的数据是这样的

[
    {
        "name": "基本概括",
        "pid": 1,
        "id": 11,
        "children": [
            {
                "name": "基本介绍",
                "pid": 11,
                "id": 111,
                "children": [
                    {
                        "name": "基本经理",
                        "pid": 111,
                        "id": 1111
                    }
                ]
            }
        ]
    },
    {
        "name": "基本回报",
        "pid": 1,
        "id": 12,
        "children": [
            {
                "name": "业绩表现",
                "pid": 12,
                "id": 112
            }
        ]
    }
]

         函数处理

function arrayToTree(list){
    const treeData = [];
    // forEach 遍历数组
    list.forEach(item => {
        // 根节点 直接push
        if(item.pid == 1) {
            treeData.push(item);
        }
        // pid等于id的属于它的子节点 放到children变量里
        const children = list.filter(data => data.pid == item.id);
        // 到达叶子节点后 return
        if(!children.length) return;
        // 把children放到对于的父节点里
        item.children = children;
    })
    return treeData;
}
var list = [
    {'name':'基本概括','pid':1,'id':11},
    {'name':'基本介绍','pid':11,'id':111},
    {'name':'基本经理','pid':111,'id':1111},
    {'name':'基本回报','pid':1,'id':12},
    {'name':'业绩表现','pid':12,'id':112}
]
console.log(arrayToTree(list));

 

数组扁平化

        1. ES6扩展运算符

var arr = [1,2,[3,4,5,[[6,7],8],9]];
    function flatten (arr) {
        while(arr.some(item => Array.isArray(item))){
            arr=[].concat(...arr);
         }
                return arr;
    }
console.log(flatten(arr));

        2. 递归

var arr = [1,2,[3,4,5,[[6,7],8],9]];
    function flatten(arr) {
    let result = [];
        arr.forEach((item, i, arr) => {
            if (Array.isArray(item)) {
                result = result.concat(flatten(item));
            } else {
                result.push(arr[i])
            }
        })
        return result;
    };
console.log(flatten(arr));

好啦,没啦,拜拜!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值