js 数组重组嵌套结构形成祖父子级数据

原数组如下

const factory_list = [
    { "id": 1, "name": "湖北工厂" },
    { "id": 2, "name": "广东工厂" },
    { "id": 3, "name": "河北工厂" },
    { "id": 4, "name": "四川工厂" },
    { "id": 5, "name": "重庆工厂" }
]
const factory_region_list = [
    { "id": 1, "name": "本部", "factory_id": 1 },
    { "id": 2, "name": "二园区", "factory_id": 1 },
    { "id": 3, "name": "本部", "factory_id": 2 },
    { "id": 5, "name": "本部", "factory_id": 3 },
    { "id": 6, "name": "本部", "factory_id": 4 },
    { "id": 7, "name": "本部", "factory_id": 5 },
]
const factory_line_list = [
    { "id": 1, "name": "一产线", "factory_id": 1, "factory_region_id": 1, },
    { "id": 3, "name": "一产线", "factory_id": 2, "factory_region_id": 3, },
    { "id": 4, "name": "二产线", "factory_id": 1, "factory_region_id": 2, },
    { "id": 5, "name": "三产线", "factory_id": 1, "factory_region_id": 2, },
    { "id": 6, "name": "八产线", "factory_id": 3, "factory_region_id": 5, },
    { "id": 7, "name": "一产线", "factory_id": 3, "factory_region_id": 5, },
    { "id": 8, "name": "六产线", "factory_id": 3, "factory_region_id": 5, },
    { "id": 9, "name": "二产线", "factory_id": 3, "factory_region_id": 5, },
    { "id": 10, "name": "一产线", "factory_id": 4, "factory_region_id": 6, },
    { "id": 11, "name": "本部", "factory_id": 5, "factory_region_id": 7, },
    { "id": 12, "name": "外协", "factory_id": 5, "factory_region_id": 7, },
    { "id": 14, "name": "外包组", "factory_id": 5, "factory_region_id": 3, },
    { "id": 15, "name": "一产线", "factory_id": 5, "factory_region_id": 3, },
    { "id": 16, "name": "五产线", "factory_id": 3, "factory_region_id": 5, },
    { "id": 17, "name": "铁产线", "factory_id": 4, "factory_region_id": 6, },
]

想要下面这样的数据结构

[
    {
        "value": 1,
        "label": "湖北工厂",
        "children": [
            {
                "value": 3,
                "label": "本部",
                "children": [
                    {
                        "value": 1,
                        "label": "一产线"
                    }
                ]
            }
        ]
    }
]

我自己是套了很多层的for来实现的,觉得性能不是很好,有没有更加优雅的写法各位大佬

阅读 1.4k
1 个回答

空间换时间思路:嵌套太多用 hash 表优化

// 转换第三组数据
const factory_line_map = factory_region_list.reduce((mp, data) => {
  mp[data.factory_region_id] = mp[data.factory_region_id] || []
  mp[data.factory_region_id].push({ value: data.id, label: data.name })
  return mp
}, {})

// 带入第二个数据结构
const factory_region_map = factory_region_list.reduce((mp, data) => {
  mp[data.factory_id] = mp[data.factory_id] || []
  mp[data.factory_id].push({
    label: data.name,
    value: data.id,
    children: factory_line_map[data.id]
  })
}, {})

// 同理带入第一个数据
factory_list.reduce((arr, data) => {
  arr.push({
    value: data.id,
    label: data.name,
    children: factory_region_map[data.id]
  })
  return arr
}, [])

整个过程化就变成了的时间复杂度就变成了线性的复杂度

补充:这个转换过程其实是重复的,上面的代码供参考,需要自己封装优化。

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