- 涉及无限次操作的一定会用到递归
原生API
返回一个拍平后的新数组
https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/flat
let arr = [3, 4, [4, 5, ['s']]]
arr.flat(2) //拍平2层, 不传参数默认拍平1层
arr.flat(Infinity) // 拍平任意层
concat实现
function flat(arr) {
let res = []
arr.forEach(item => {
res = res.concat(Array.isArray(item) ? flat(item) : item)
})
return res
}
reduce 实现
function flat(arr) {
return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flat(cur) : cur), [])
}
栈实现
function flat(arr) {
const res = []
const stack = [].concat(arr)
while (stack.length) {
const item = stack.pop()
if (Array.isArray(item)) {
stack.push(...item)
} else {
res.unshift(item)
}
}
return res
}
可控制扁平化层数
// reduce + 递归
function flat(arr, num = 1) {
return num > 0
? arr.reduce(
(pre, cur) =>
pre.concat(Array.isArray(cur) ? flat(cur, num - 1) : cur),
[]
)
: arr.slice();
}
在原数组上进行操作
function flat(arr) {
let i = 0
while (i < arr.length) {
if (Array.isArray(arr[i])) {
let tmp = flat(arr[i])
arr.splice(i, 1, ...tmp)
i += tmp.length
}
i++
}
return arr
}
参考链接:
https://segmentfault.com/a/1190000021366004