js数组的处理?

arr = [
  {parentId: 'sdf', name:'a', id:'jpi'},
  {parentId: 'jpi', name:'b', id:'jsn'},
  {parentId: 'jpi', name:'c', id:'sdb'},
  {parentId: 'jsn', name:'d', id:'vde'},
  {parentId: 'vcb', name:'e', id:'ee'},
]

变成

arr2 =  [
  {
     parentId: 'sdf', name:'a', id:'jpi', 
     children:[
        {
          parentId: 'jpi', name:'b', id:'jsn', 
          children:[
            { parentId: 'jsn', name:'d', id:'vde' }
          ]
       },
       { parentId: 'jpi', name:'c', id:'sdb' }
    ]
  },
  { parentId: 'vcb', name:'e', id:'ee' }
]
阅读 1.2k
2 个回答
var idMap = arr.reduce((res,v) => (res[v.id] = v,res),{})

var arr2 = arr.reduce((res,v) => {
  idMap[v.parentId] ? (idMap[v.parentId].children ||= []).push(v) : res.push(v)
  return res;
}, [])

js 代码

Object.values(arr.reduce((o, i) => {
    i = Object.assign(o[i.id] ??= {}, i);
    ((o[i.parentId] ??= {}).children ??= []).push(i);
    return o;
}, {})).filter(v => !('id' in v)).flatMap(i => i.children)

结果

[
  {
    "parentId": "sdf",
    "name": "a",
    "id": "jpi",
    "children": [
      {
        "parentId": "jpi",
        "name": "b",
        "id": "jsn",
        "children": [
          {
            "parentId": "jsn",
            "name": "d",
            "id": "vde"
          }
        ]
      },
      {
        "parentId": "jpi",
        "name": "c",
        "id": "sdb"
      }
    ]
  },
  {
    "parentId": "vcb",
    "name": "e",
    "id": "ee"
  }
]
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题