源数据
对以下源数据输出[ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 ]
let sourcData = [
1,
[
2,
[3, 4, [5, 6]],
[7,8]
],
[9, 10],
11
]
复制代码
迭代遍历
多维数组可看成说一颗多叉树,采用迭代遍历。关键在于去构建栈结构。
const flatten = (arr) => {
let data = []
let stack = arr
while(stack.length) {
let first = stack.shift()
if (Array.isArray(first)) {
stack.unshift(...first)
} else {
data.push(first)
}
}
return data
}
复制代码
递归实现一
在递归方法执行时,假如在函数内部声明变量存储结果集,会被重新初始化,就要采用concat方法来存储上一次的数据。
const flatten = (arr) => {
let data = arr.reduce((pre, curr) => {
return pre.concat(Array.isArray(curr) ? flatten(curr) : curr)
}, [])
return data
}
复制代码
递归实现二
将结果集作为外部变量声明,或者作为参数在每次递归中传递,也可实现数据的存储。推荐方法1。
const flatten = (arr = [], data = []) => {
arr.forEach(item => {
if (Array.isArray(item)) {
flatten(item, data)
} else {
data.push(item)
}
})
}
复制代码