数组的扁平化:就是将一个嵌套多层的数组转换为一维数组
例如:数组 [1, 2, [3, 4, [5, 6], 7], 8] 扁平化后为 [1, 2, 3, 4, 5, 6, 7, 8]
解决的方案有多种,这里我们只讲比较常用的三种:
第一种:递归解决方案
解决思路:
- 首先遍历数组,通过
Array.isArray()
方法判断数组项是否为数组类型; - 如果是数组类型,则将该项传入递归函数进行遍历,重复进行当前操作,直到找到最内层一维数组,返回数组并拼接到上一级数组;
- 如果不是数组类型,则直接
push
到结果数组result
中,最后遍历结束返回result
数组。
const arr = [1, 2, [3, 4, [5, 6], 7], 8]
function flatten(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
// 判断类型是否为数组
if (Array.isArray(arr[i])) {
result = result.concat(flatten(arr[i]))
} else {
result.push(arr[i])
}
}
// 返回
return result
}
flatten(arr) // [1, 2, 3, 4, 5, 6, 7, 8]
第二种:通过 toString()
方法
解决思路:如果数组元素都是数字,则可以通过使用 toString()
方法。toString()
方法直接会将多维数组转换为扁平化后的字符串:例如 [1, [2, [3, 4]]].toString() // '1,2,3,4'
。
const arr = [1, 2, [3, 4, [5, 6], 7], 8]
function flatten(arr) {
return arr.toString().split(',').map(item => Number(item))
}
flatten(arr) // [1, 2, 3, 4, 5, 6, 7, 8]
第三种:通过数组的扩展运算符(...
)和数组 concat()
方法
解决思路:
- 首先通过 while 循环,判断数组中是否存在数组项
- 判断有数组项,则通过
concat()
方法合并一个或多个数组的特性,再通过扩展运算符将数组变为concat()
的参数序列,完成外层数组的扁平化,循环执行,直到完全扁平化数组; - 判断没有数组项,说明已经完成数组扁平化了,直接返回结果。
const arr = [1, 2, [3, 4, [5, 6], 7], 8]
function flatten(arr) {
let result = []
while(arr.some(item => Array.isArray(item))) {
arr = [].concat(...arr)
}
return arr
}
flatten(arr) // [1, 2, 3, 4, 5, 6, 7, 8]