- 涉及無限次操作的一定會用到遞歸
原生API
返回一個拍平后的新數(shù)組
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層, 不傳參數(shù)默認拍平1層
arr.flat(Infinity) // 拍平任意層
concat實現(xiàn)
function flat(arr) {
let res = []
arr.forEach(item => {
res = res.concat(Array.isArray(item) ? flat(item) : item)
})
return res
}
reduce 實現(xiàn)
function flat(arr) {
return arr.reduce((pre, cur) => pre.concat(Array.isArray(cur) ? flat(cur) : cur), [])
}
棧實現(xiàn)
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
}
可控制扁平化層數(shù)
// 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();
}
在原數(shù)組上進行操作
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
}