把 list 转换成树形结构

实现一个 convert 函数实现下面的需求,要求支持多级(可以根据 list,实现 4 级 5 级以及尽可能降低时间复杂度)

// ["一级品类", "二级品类", "三级品类"]
let list = [
        ["个护", "全身", "止汗"],
        ["个护", "全身", "身体乳液"],
        ["个护", "全身", "身体护理套装"],
        ["个护", "全身", "身体磨砂"],
        ["彩妆", "唇部", "唇线"],
        ["彩妆", "唇部", "唇膏"],
        ["彩妆", "唇部", "唇部妆前定妆"],
        ["彩妆", "唇部", "唇釉"],
        ["彩妆", "彩妆套装", "彩妆套装"],
        ["彩妆", "眼部", "眉妆"],
    ]
    
    
 const result = convert(list, ...);

// 转换后的结果如下
let result = [
    {
        'name':'个护',
        'children': [
            {
                'name': '全身',
                'children': [
                    {
                        'name':'止汗'
                    },
                    {
                        'name': '身体乳液'
                    }
                    ...
                ]
            }
        ]
    }
    ...
]
已解决 悬赏分:70 - 解决时间 2021-11-26 11:25
反对 0举报 0 收藏 0

回答1

最佳
  • @
    const fn = list => {
        let rtn = []
        list.forEach(arr => {
            let p = rtn
            arr.forEach((name, level) => {
                if (p.map(item => item.name).indexOf(name) < 0) p.push({ name })
                const index = p.map(item => item.name).indexOf(name)
                if (level === arr.length - 1) return
                if (!p[index].children) p[index].children = []
                p = p[index].children
            })
        })
        return rtn
    }
    console.log(JSON.stringify(fn(list), '  ', 2))
    [
      {
        "name": "个护",
        "children": [
          {
            "name": "全身",
            "children": [
              {
                "name": "止汗"
              },
              {
                "name": "身体乳液"
              },
              {
                "name": "身体护理套装"
              },
              {
                "name": "身体磨砂"
              }
            ]
          }
        ]
      },
      {
        "name": "彩妆",
        "children": [
          {
            "name": "唇部",
            "children": [
              {
                "name": "唇线"
              },
              {
                "name": "唇膏"
              },
              {
                "name": "唇部妆前定妆"
              },
              {
                "name": "唇釉"
              }
            ]
          },
          {
            "name": "彩妆套装",
            "children": [
              {
                "name": "彩妆套装"
              }
            ]
          },
          {
            "name": "眼部",
            "children": [
              {
                "name": "眉妆"
              }
            ]
          }
        ]
      }
    ]
    [Finished in 0.1s]
    支持 0 反对 0 举报
    2021-11-25 16:10