一、什么是’扁平化‘
扁平化
的意思对于数组来说,就是将多维数组
展开成一维数组
或少于当前数组维数
的数组。
二、实现扁平化
1、toString 和 split 相结合
思路:
toString
可以将多维数组
转变成字符串
,在通过 split
转换成数组,此时每个元素都为字符串,但需注意的是 此时每个数组元素都为字符串
,可以用Number
进行转换。
实现:
代码语言:javascript复制let arr = [1,2,[3,4,[5,6,7]]]
function strSplit (arr) {
return arr.toString().split(',').map((i) => Number(i))
}
console.log('结果是:', strSplit(arr)) // 结果是:[1,2,3,4,5,6,7]
2、reduce迭代
思路:
reduce
为数组中的每一个元素依次执行回调函数,不包括数组中被删除或从未被赋值的元素,接受四个参数:初始值
(或者上一次回调函数的返回值
),当前元素值
,当前索引
,调用 reduce 的数组。可以通过迭代的方式进行数组扁平化~
实现:
代码语言:javascript复制let arr = [1, [2, [3, 4, 5]]]
function reduceArr (arr) {
let result = arr.reduce((newArr, i) => {
return newArr.concat(Array.isArray(i) ? reduceArr(i) : i)
}, [])
return result
}
console.log('结果是:', reduceArr(arr)) // 结果是:[1,2,3,4,5]
3、es6 flat函数
思路:
es6的 flat
函数实现数组的扁平化,语法:Array.flat(dep),
dep
为展开数组的维数(整数),如 dep 是 1, 就是展开1层,如想多维数组都展开成一维数组则 直接 dep 等于 Infinity
。
实现:
代码语言:javascript复制let arr = [1,2,[3,4,5]]
function es6Arr (arr) {
return arr.flat(Infinity)
}
console.log('结果是:', es6Arr(arr)) // 结果是:[1,2,3,4,5]
4、递归实现
思路:
递归的思路就是,通过遍历,判断元素是否是数组
,如果是数组则继续执行此函数,直至将
实现:
代码语言:javascript复制 let arr = [1, [2, [3, 4, 5]]];
function floatDg (arr) {
let result = []
for(let i = 0; i < arr.length; i ) {
if (Array.isArray(arr[i])) {
result = result.concat(floatDg(arr[i]))
} else {
result.push(arr[i])
}
}
return result
}
console.log(floatDg(arr), '递归') // 结果:[1,2,3,4,5]
当然除了以上4中还有很多种方法如:
- es6扩展运算符符 ...
- 正则
大家可以去思考,去实现,本篇不再多做赘述~,如有问题,请大家多多交流指正~