- 普通的递归
function flatten(arr) {
let result = []
const flattenInner = (arr) => {
arr.forEach(value => {
if (Array.isArray(value)) {
flattenInner(value)
} else {
result.push(value)
}
})
}
flattenInner(arr)
return result
}
内部有一个用于递归的函数, 递归地去处理类型是数组的元素
- 使用 reduce (内部还是递归)
const flatten = arr => {
const result = arr.reduce((temp, value) => {
if (Array.isArray(value)) {
return temp.concat(flatten(value))
}
return temp.concat(value)
}, [])
return result
}
- 使用concat
concat 是数组的方法, 它可以将多个数组(和/或)值连接成新数组,举个例子
[1, 2, 3, 4].concat(1, 2, [3, [4]]) // [1, 2, 3, 4, 1, 2, 3, [4]]
这个方法的实现思路是:只要这个数组内的元素还包含数组,就会对这个数组的元素在执行一次concat方法
const flatten = arr => {
const isContainsArray = (arr) => {
return arr.some(item => Array.isArray(item))
}
while (isContainsArray(arr)) {
arr = [].concat(...arr)
}
return arr
}