javascript 一维数组与树形数据的转换

javascript 一维数组与树形数据的转换

1. 将扁平化的数组转为树状结构

模拟数据

let datas = [
    { label: '111', id: 1, parentid: 0 },
    { label: '222', id: 2, parentid: 0 },
    { label: '333', id: 3, parentid: 0 },
    { label: '22221', id: 21, parentid: 2 },
    { label: '22222221', id: 221, parentid: 21 },
    { label: '22222', id: 22, parentid: 2 },
    { label: '11111', id: 11, parentid: 1 },
    { label: '11112', id: 12, parentid: 1 }
]
function arrayToTreeData(data, idkey, pIdKey, children) {
    let key = idkey ? idkey : 'id';
    let parentKey = pIdKey ? pIdKey : 'parentid';
    let childKey = children ? children : 'children';
    let r = [];
    let tmpMap = [];
    for (let i = 0, l = data.length; i < l; i++) {
        data[i].key = data[i].id;
        data[i].label = data[i].label;
        tmpMap[data[i][key]] = data[i];
    }
    for (let i = 0, l = data.length; i < l; i++) {
        if (tmpMap[data[i][parentKey]] && data[i][key] != data[i][parentKey]) {
            if (!tmpMap[data[i][parentKey]][childKey]) {
                tmpMap[data[i][parentKey]][childKey] = [];
            }
            tmpMap[data[i][parentKey]][childKey].push(data[i]);
        } else {
            r.push(data[i]);
        }
    }
    return r;
}
console.log(arrayToTreeData(datas))

在这里插入图片描述

2. 树形转数组

模拟数据

let datas = [{
        label: '111',
        id: 1,
        parentid: 0,
        children: [{ label: '11111', id: 11, parentid: 1 },
            { label: '11112', id: 12, parentid: 1 }
        ]
    },
    {
        label: '222',
        id: 2,
        parentid: 0,
        children: [{
                label: '22221',
                id: 21,
                parentid: 2,
                children: [{ label: '22222221', id: 221, parentid: 21 }, ]
            },
            { label: '22222', id: 22, parentid: 2 },
        ]
    },
    { label: '333', id: 3, parentid: 0 },
]
function treeToList(value) {
    let nodes = value,
        _nodes = [];
    _nodes = _nodes.concat(...nodes);
    nodes.forEach(n => {
        getArray(n, _nodes);
    });
    return _nodes;
}

function getArray(node, nodes) {
    if (node['children'] && node['children'].length) {
        nodes.push(...node['children']);
        node['children'].forEach(n => getArray(n, nodes));
    }
}
console.log(treeToList(datas))

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值