有没有性能比较好的方法,把这对象变成树形结构

image.png

export const permission = {
  "Home": "首页",
  "Home/Music": "音乐",
  "Home/Video": "视频",
  "Home/Picture": "图片",
  "About": "关于",
  "About2": "关于2",
  "Home/Setting": "设置",
  "About/Contact": "联系我们",
  "Home/Setting/System": "系统设置",
  "Home/Setting/User": "用户设置",
};

转成

{
    name:"Home",
    path:"/Home",
    title:"首页",
    children:[
        {
         name:"Music",
            path:"/Home/Music",
            title:"音乐",
        }
    ]
}
阅读 1.8k
2 个回答

一共 N * 3 次

 const permission = {
    "Home": "首页",
    "Home/Music": "音乐",
    "Home/Video": "视频",
    "Home/Picture": "图片",
    "About": "关于",
    "About2": "关于2",
    "Home/Setting": "设置",
    "About/Contact": "联系我们",
    "Home/Setting/System": "系统设置",
    "Home/Setting/User": "用户设置",
  };

  const list = Object.keys(permission).map(key => {
    const pathArr = key.split('/')
    const pName = pathArr[pathArr.length - 2]
    const name = pathArr[pathArr.length - 1]

    return {
      pName,
      name,
      title: permission[key],
      path: key,
    }
  })

  let map = list.reduce((acc, current) => {
    let key = 'name'
    let _key = `key_${[current[key]]}`
    acc[_key] = current
    return acc
  }, {})

  let result = []
  list.forEach((item) => {
    let _key = `key_${item.pName}`
    let parent = map[_key]

    if (!parent) {
      result.push(item)
    } else {
      parent.children = parent.children || []
      parent.children.push(item)
    }
  })

  console.log('result: ', result);

正好回答了个类似的,大概是这个意思,自己再根据情况完善下就行了

function transData(data){
    let obj = {}
    for(let key in data){
        let title = data[key]
        let list = key.split('/')
        list.reduce((parent, citem) => {
            return (parent[citem] = parent[citem] || {})
        }, obj)
    }
    return loop(obj, '/', data)
}
function loop(obj, path, data){
    return Object.keys(obj).map(key => {
        let p = path + key, cc = loop(obj[key], p + '/', data)
        return {
            name: key,
            title: data[p.slice(1)],
            path: p,
            children: cc.length ? cc : undefined
        }
    })
}

transData({
    Home: "首页",
    "Home/Music": "音乐",
    "Home/Video": "视频",
    "Home/Picture": "图片",
    About: "关于",
    About2: "关于2",
    "Home/Setting": "设置",
    "About/Contact": "联系我们",
    "Home/Setting/System": "系统设置",
    "Home/Setting/User": "用户设置"
})
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题