黑马程序员技术交流社区

标题: 一维数组转多维数组,多维数组转一维数组(树形结构) [打印本页]

作者: JoyZhang    时间: 2021-5-5 17:56
标题: 一维数组转多维数组,多维数组转一维数组(树形结构)
### 1. 一维数组转多维数组
```
let arr = [
  {
    id: 1,
    p_id: 0,
    name: '首页',
  },
  {
    id: 2,
    p_id: 0,
    name: '菜单管理',
  },
  {
    id: 3,
    p_id: 0,
    name: '菜单列表',
  },
  {
    id: 4,
    p_id: 1,
    name: '权限管理',
  },
  {
    id: 5,
    p_id: 6,
    name: '管理员列表',
  },
  {
    id: 6,
    p_id: 4,
    name: '角色列表',
  },
]
// 1、先拿p_id为0的
// function newArrFn(arr, rootValue = 0) {
//   return arr.reduce((acc, cur) => {
//     if (cur.p_id === rootValue) {
//       acc.push(cur) // 返回值 新数组的长度
//       // 2、先拿p_id为1的
//       const children = newArrFn(arr, cur.id)
//       // 加到children
//       cur.children = children
//     }
//     return acc
//   }, [])
// }

function newArrFn(arr, rootValue = 0) {
    return arr.reduce((acc, cur) => {
      if (cur.p_id === rootValue) {
        const children = newArrFn(arr, cur.id)
        cur.children = children
        acc.push(cur) // 返回值 新数组的长度
      }
      return acc
    }, [])
}
console.log(newArrFn(arr))
```
### 2.1 二维转一维数组
```
const arr = [[1, 2], [3, 4], [5, 6], 7]
// function newArrFn(arr) {
//   return arr.reduce((acc, cur) => {
//     // return acc.concat(cur)
//     acc.concat(cur) // 错误
//     return acc // 错误
//   }, [])
// }
function newArrFn(arr) {
  return arr.reduce((acc, cur) => acc.concat(cur), [])
}
console.log(newArrFn(arr))
```
### 2.2 多维转一维数组
```
const arr = [[1, 2, [1, 2, [1, 2]]], [3, 4], [5, 6], 7]
// function newArrFn(arr) {
//   return arr.reduce((acc, cur) => {
//     if (Array.isArray(cur)) {
//       return acc.concat(newArrFn(cur))
//     } else {
//       return acc.concat(cur)
//     }
//   }, [])
// }
function newArrFn(arr) {
    return arr.reduce((acc, cur) => acc.concat(Array.isArray(cur) ? newArrFn(cur) : cur), [])
}
console.log(newArrFn(arr))

```
### 2.3 多维转一维数组(内含对象)
```
const arr = [
    {
      id: 1,
      p_id: 0,
      name: '首页',
      children: [
        {
          id: 4,
          p_id: 1,
          name: '权限管理',
          children: [
            {
              id: 6,
              p_id: 4,
              name: '角色列表',
              children: [
                {
                  id: 5,
                  p_id: 6,
                  name: '管理员列表',
                },
              ],
            },
          ],
        },
      ],
    },
    {
      id: 2,
      p_id: 0,
      name: '菜单管理'
    },
    {
      id: 3,
      p_id: 0,
      name: '菜单列表'
    }
]
// function newArrFn(arr) {
//   return arr.reduce((acc, cur) => {
//     if (Array.isArray(cur.children)) {
//       // acc = acc.concat(cur)
//       // return acc.concat(newArrFn(cur.children))
//       return acc.concat(cur, newArrFn(cur.children))
//     } else {
//       return acc.concat(cur)
//     }
//   }, [])
// }
function newArrFn(arr) {
    return arr.reduce((acc, cur) => acc.concat(cur, Array.isArray(cur.children) ? newArrFn(cur.children) : []), [])
}
console.log(newArrFn(arr))
```






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2