js多层级嵌套对象扁平化

有这样一个对象

var wrap_group = [
    {
        value: 'A',
        group: [
            {
                value: '1',
                group: [
                    {value: '12'}
                ]
            },
            {
                value: '3',
                group: [
                    {value: '10'}
                ]
            }
        ]
    },
    {
        value: 'B',
        group: [
        {
            value: '2',
            group: [
                {value: '22'}
            ]
        }
        ]
    }
]

想把对象优雅的转换为一下形式的:
wrap_group = [

{
    building_number: 'A',
    floor_number: '1',
    room_number: '12'
},
{
    building_number: 'A',
    floor_number: '3',
    room_number: '10'
},
{
    building_number: 'B',
    floor_number: '2',
    room_number: '22'
},

]
请介绍下具体的思路和代码。

阅读 10.7k
3 个回答

可转化为深度优先搜索遍历打印路径问题。

简单实现:

function flatten (group) {
  const result = []
  group.forEach(kid => bfs(kid, []))
  return result

  function bfs (node, path) {
    if (!node.group/* or path.length === 2 */) {
      const [building_number, floor_number] = path
      result.push({ building_number, floor_number, room_number: node.value })
    } else {
      path.push(node.value)
      node.group.forEach(kid => bfs(kid, path))
      path.pop()
    }
  }
}

console.log(flatten(wrap_group))

我只想到了循环法和解构法,等大神分享新思路。

function flatSub(arr, value)
{
    return  [].concat(...arr.map(function(item) {
        return {building_number: value,floor_number:item.value, room_number: item.group[0].value}
    }))
}

var result = [].concat(...wrap_group.map(function(item) {
    return flatSub(item.group, item.value)
}))

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