数组转树,树转数组攻略大全

8 篇文章 0 订阅

数组转树,树转数组攻略大全

  let list = [  //数据结构
        {
            pid: null,
            id: 1,
            serialNumber: '1',
        },
        {
            pid: 1,
            id: 11,
            serialNumber: '1',
        },
        {
            pid: 11,
            id: 111,
            serialNumber: '1',
        },
        {
            pid: null,
            id: 2,
            serialNumber: '1',
        },
        {
            pid: 2,
            id: 22,
            serialNumber: '1',
        },
        {
            pid: 22,
            id: 222,
            serialNumber: '1',
        },
    ]
  const defaultSetting = {  //配置项
        isParent: 'isParent',
        childrenKey: 'children',
        nameKey: 'name',
        titleKey: 'title',
        idKey: 'id',
        pIdKey: 'pid',
        levelKey: 'level',
        rootPId: null
    }

首先进行数组转树

 function transformToTreeFormat(data, setting = {}) {
        const sNodes = JSON.parse(JSON.stringify(data)) //克隆一份数据
        setting = defaultSetting
        const idKey = setting.idKey
        const pIdKey = setting.pIdKey //设置找到的父元素key
        const childrenKey = setting.childrenKey //父元素里子元素key名

        let i, j, l
        if (!idKey || idKey === '' || !sNodes) {
            return []
        }
        if (sNodes instanceof Array) {
            const r = []
            const tmpMap = []
            for (i = 0, l = sNodes.length; i < l; i++) {
                tmpMap[sNodes[i][idKey]] = sNodes[i]
            }

            for (j = 0, l = sNodes.length; j < l; j++) {
                if (tmpMap[sNodes[j][pIdKey]] && sNodes[j][idKey] !== sNodes[j][pIdKey]) {
                    if (!tmpMap[sNodes[j][pIdKey]][childrenKey]) {
                        tmpMap[sNodes[j][pIdKey]][childrenKey] = []
                    }
                    tmpMap[sNodes[j][pIdKey]][childrenKey].push(sNodes[j])
                } else {
                    r.push(sNodes[j])
                }
            }
            return r
        } else {
            return [sNodes]
        }
    }
console.log(transformToTreeFormat(list)) //

打印的结果

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7ZIfcQxR-1636424146346)(C:\Users\xiaoxinxin\AppData\Roaming\Typora\typora-user-images\image-20211109101228846.png)]

然后进行树转数组

 function transformToArrayFormat(data, setting = {}) {
        if (!data) return []

        function _do(_node) {
            r.push(_node)

            const children = nodeChildren(_node, setting)
            if (children) {
                r = r.concat(transformToArrayFormat(children, setting))
            }
        }

        const nodes = JSON.parse(JSON.stringify(data))
        setting = defaultSetting
        let r = []
        if (nodes instanceof Array) {
            for (let i = 0, l = nodes.length; i < l; i++) {
                const node = nodes[i]
                _do(node)
            }
        } else {
            _do(nodes)
        }
        return r
    }

    function nodeChildren(node, setting, newChildren) {
        if (!node) {
            return null
        }
        const key = setting.childrenKey
        if (typeof newChildren !== 'undefined') {
            node[key] = newChildren
        }
        return node[key]
    }

    let arrlist = transformToArrayFormat(treelist)
    console.log(arrlist)

    function setName(data) {
        for (var i in data) {
            if (data[i].children) {
                delete data[i].children
            }
        }
    }
    setName(arrlist)

在这里插入图片描述


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Mangoxin1

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

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

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

打赏作者

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

抵扣说明:

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

余额充值