把多维数组转成一维数组

695 阅读3分钟

这是我参与8月更文挑战的第5天,活动详情查看:8月更文挑战

前言

我们经常在业务上或者面试的时候遇到需要

把多维数组转成一维数组?

今天就讲讲实现的几种方法,总结一下,加深印象,大家有兴趣可以探讨一下。

concat方法

数组的concat方法,用于拼接多个数组,最后返回一个拼好的新数组。

arr.concat(arr1, arr2, arr3,...)

基本用法:

let arr = [1,2,3]
const newArr = arr.concat([4,5,6])
console.log(newArr) // [1, 2, 3, 4, 5, 6]

arr1,arr2,...不局限于是数组,可以是其他类型

let arr = [1,2,3]
const newArr = arr.concat(4,5,6)
console.log(newArr) // [1, 2, 3, 4, 5, 6]

利用concat把多维数组转成一维数组

let arr = [[1],[2],3]
// 第一种方法
const newArr = [].concat(...arr)
console.log(newArr) // [1, 2, 3]

// 第二种方法
const newArr1 = [].concat.apply([], arr)
console.log(newArr1) // [1, 2, 3]

测试通过,可以把多维数组转成一维数组。

先别高兴的太早,再看个例子

let arr = [[1],[[2]],3]
// 第一种方法
const newArr = [].concat(...arr)
console.log(newArr) // [1, [2], 3]

从以上例子可以看出,concat方法只支持于二维数组,如果是三维或者更多维数组,它就处理不了。

递归遍历

那针对比二维数组还复杂的多维数组该怎么办?

可以使用递归遍历。

先看代码:

let arr = [[1],[[[2]]],[[[3]]]]
function flat (arr, flatArr = []) {
  arr.forEach(item => {
    if(Array.isArray(item)) flat(item, flatArr)
    else flatArr.push(item)
  })
  return flatArr
}

flat(arr) //  [1, 2, 3]

解析:

  • 我们先定义一个flat函数,在这个函数里面,我们对arr进行遍历
  • 如果遍历到的元素是数组,则会继续递归调用flat函数,知道遍历的元素不是元素
  • 如果遍历到的元素不是数组,则把它push到flatArr中
  • 最后返回flatArr数组,这时候flatArr里面的就是一维数组。

flat方法

flat是es6新增的方法。它可以用来扁平化数组,把多维数组转成一维数组。

下面来看看它的用法

arr.flat(depth)

  • depth

可选,depth为需要把几层的数组来扁平化,默认是1。

[1,[2],[3]].flat() // [1, 2, 3]
// 等同于
[1,[2],[3]].flat(1) // [1, 2, 3]

当你的数组的层级是不清楚的时候,你可以把depth设置为Infinity, 代表的是无限级.

[[[1]],[2],[[[[3]]]]].flat(Infinity) // [1, 2, 3]

值得一提的是,es6还新增了一个flatMap方法。它会对数组的每个元素都执行回调函数,返回由返回值组成的新数组,最后对新数组调用flat()

语法:

arr.flatMap(fn)

注意,flatMap只支持flat一层

下面通过例子来看看

var arr = [1,[2],[3]]
arr.flatMap(item => item) // [1, 2, 3]

var arr = [1,[2],[3]]
arr.flatMap(item => [item]) // [1, [2], [3]]

感觉flatMap方法等同于数组先调用map方法后再调用flat(),你们觉得呢?

总结

针对上面讲的方法

  • 如果你的数组就是二维的,那么你就可以使用concat方法

  • 如果你想试试新语法,那么你可以使用flat方法

  • 如果想兼容性好,不想用pollyfill,那么就可以考虑递归遍历

以上就是我总结的把多维数组转成一维数组的几种方法,大家如果有更好的方法欢迎评论沟通。

感谢你们的阅读,希望对你们有帮助。