JavaScript怎么遍历这样的一个Json的对象数组?用递归or循环?

发布于 2022-09-07 23:52:52 字数 1427 浏览 22 评论 0

比如有这样一个对象数组

let data = [
{
    title: '标题一',
    tagName: 'h1'
},
{
    title: '标题二',
    tagName: 'h1'
},
{
    title: '标题三',
    tagName: 'h2'
},
{
    title: '标题四',
    tagName: 'h3'
},
{
    title: '标题五',
    tagName: 'h2'
},
{
    title: '标题六',
    tagName: 'h1'
},
{
    title: '标题七',
    tagName: 'h1'
},
{
    title: '标题八',
    tagName: 'h2'
},
{
    title: '标题九',
    tagName: 'h3'
},
{
    title: '标题十',
    tagName: 'h3'
}
]

要求根据tagName的优先级,从h1开始排,一直到h6,每个h1后面直到下个h1之前的都是它的children节点,依次内推,比如上面的数据这样处理后就会像下面的格式:

let data = [
    {
      title: '标题一',
      tagName: 'h1'
    },
    {
      title: '标题二',
      tagName: 'h1',
      children: [
        {
          title: '标题三',
          tagName: 'h2'
          children: [
             {
                 title: '标题四',
                 tagName: 'h3'
             }
          ]
        },
        {
          title: '标题五',
          tagName: 'h2'
        }
      ]
    },
    {
      title: '标题六',
      tagName: 'h1'
    },
    {
      title: '标题七',
      tagName: 'h1',
      children: [
        {
          title: '标题八',
          tagName: 'h2',
          children: [
            {
              title: '标题九',
              tagName: 'h3'
            },
            {
              title: '标题十',
              tagName: 'h3'
            }
          ]
        }
      ]
    }
]

怎么写这样的一个遍历算法呢?求大佬指教

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

oО清风挽发oО 2022-09-14 23:52:52
function collect(arr, i, parent) {
    if (i >= arr.length) {
        return i
    }
    let current = arr[i]
    if (current.tagName > parent.tagName) {
        parent.children.push(current)
    } else {
        return i
    }
    i++
    let next = arr[i]
    if (!next) {
        return i
    }
    if (next.tagName > current.tagName) {
        current.children = []
        i = collect(arr, i, current)
    }
    return collect(arr, i, parent)
}

var ret = {
    tagName: 'h0',
    children: []
}
collect(data, 0, ret)

console.log(ret.children)
孤者何惧 2022-09-14 23:52:52

@yuanxiaowa 想再问下你。。如果要顺序遍历处理好格式的结果 怎么写呢。。。就相当于遍历结果数组的每一个对象 按照原来对象的顺序打印输出:

{
    title: '标题一',
    tagName: 'h1'
},
{
    title: '标题二',
    tagName: 'h1'
},
{
    title: '标题三',
    tagName: 'h2'
},
{
    title: '标题四',
    tagName: 'h3'
},
{
    title: '标题五',
    tagName: 'h2'
},
{
    title: '标题六',
    tagName: 'h1'
},
{
    title: '标题七',
    tagName: 'h1'
},
{
    title: '标题八',
    tagName: 'h2'
},
{
    title: '标题九',
    tagName: 'h3'
},
{
    title: '标题十',
    tagName: 'h3'
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文