数组扁平化是指将一个多维数组变为一维数组
[1, [2, 3, [4, 5]]] ——> [1, 2, 3, 4, 5]

  • 递归法
  • reduce 实现
  • split法
  • 正则匹配
  • ES6

递归法

通过判断当前是否是数组,然后通过递归实现

1
2
3
4
5
6
7
8
9
10
11
unction flatten (arr) {
let res = []
arr.map((item) => {
if(Array.isArray(item)){
res = res.concat(flatten(item))
} else {
res.push(item)
}
})
return res
}

reduce 实现

1
2
3
4
5
6
7
8
9
10
11
function flatten (arr) {
let res = []
arr.map((item) => {
if(Array.isArray(item)){
res = res.concat(flatten(item))
} else {
res.push(item)
}
})
return res
}

split法

如果一个需要实现扁平化的数组里都是数字类型的话可以用下面这种方法>数字类型的话可以用下面这种方法

1
2
3
4
5
function flatten(arr) {
arr.toString().split(',').map((item) =>{
return Number(item)
})
}

正则匹配

通过正则匹配将‘[’或者‘]’符号替换成空字符串

1
2
const handle = array => JSON.parse(`[${JSON.stringify(array).replace(/\[|]/g,'')}]`)
handle(array)

ES6

flat()

数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

1
2
3
4
[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]
[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

注意flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。

或者使用Infinity关键字

Infinity(无穷大)在 JS 中是一个特殊的数字,它的特性是:它比任何有限的数字都大
JS中的Infinity表示无穷数的概念。 任何有限数均小于Infinity,而任何有限数均大于-Infinity。

1
2
3
4
arr.flat(Infinity)

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

实现方法有很多,原理基本一样,只要你对js熟悉,可以有很多实现方法