如何将一组数组数据的每层层次标识出来

我现在有一个数组对象,数组中的每个对象下可能存在子集,也可能不存在,目前我用循环递归的方法把数据解析出来了,但是我现在不知道该怎么在数组的每一层添加它们自己的标识,意思就是说,如果数组中的某一项没有子集,则该数组的层次是1;如果数组中的某一项有子集,且这个子集自己也有子集,那这一项的层次该如何标识出来,具体的代码和截图可以看下面的描述

`
let arr = [

{
    title: '我是标题1,我没有子集',
    href: 'xxxxx',
    children: []
},
{
    title: '我是标题2,我没有子集',
    href: 'xxxxx',
    children: [
        {
            title: '我是标题2的子集,我没有子集',
            href: 'xxxxx',
            children: []
        },
        {
            title: '我是标题2的子集,我没有子集',
            href: 'xxxxx',
            children: []
        },
        {
            title: '我是标题2的子集,我有子集',
            href: 'xxxxx',
            children: [
                {
                    title: '我是标题2的子集的子集,我没有子集',
                    href: 'xxxxx',
                    children: []
                },
                {
                    title: '我是标题2的子集的子集,我没有子集',
                    href: 'xxxxx',
                    children: []
                },
                {
                    title: '我是标题2的子集的子集,我没有子集',
                    href: 'xxxxx',
                    children: []
                }
            ]
        }
    ]
},
{
    title: '我是标题3,我有子集',
    href: 'xxxxx',
    children: []
}

]

arr.forEach(item => {

test(item)

})

function test(item) {

if (item.children.length) {
    item.children.forEach(ele => {
        ele.div = '<div>'+ele.title+'</div>'
        test(ele)
    })
} else {
    item.div = '<div>'+item.title+'</div>'
}

}

console.log(arr)
`

图片描述

如上描述,有人能给出一个解决方法或者提示信息吗?多谢各位

阅读 2.1k
1 个回答

看你的需求,用递归来做会好一些,但是这个尾递归很难进行优化
因为这个类似的需求肯定是要先获取到最深层的节点,为了避免一些重复计算,就很难做成尾递归的形式,因为上次调用栈的信息需要存储,在内部函数执行完毕后拿到结果再进行赋值:

func(data)

console.log(data)
  
function func(data) {
  data.forEach(item => {
    item.depth = getDepth(item)
  })
}

function getDepth(data) {
  return data.children.length ? Math.max(...data.children.map(child => {
    child.depth = getDepth(child)
    return (child.depth || 0) + 1
  })) : 1
}

P.S. 这两个函数可以合并为一个,就留给你自己练手咯

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题