数组扁平化:将一个多维数组转换为一个一维数组
举个例子:
var arr = [1, 2, [3, 4], [5, 6, [7, 8]]]
扁平化后
arr = [1, 2, 3, 4, 5, 6, 7, 8]
实现方法:
1.Array.prototype.flat()
- flat() 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
var arr = [1, 2, [3, 4], [5, 6, [7, 8]]]
遍历深度默认为1
arr.flat()
[ 1, 2, 3, 4, 5, 6, [ 7, 8 ] ]
arr.flat(2)
[ 1, 2, 3, 4, 5, 6, 7, 8 ]
遍历深度无限深
arr.flat(Infinity)
[ 1, 2, 3, 4, 5, 6, 7, 8 ]
2.递归实现
function flatten(arr) {
let newArr = []
for(let i in arr) {
//如果元素为数组,递归调用该函数
if(Array.isArray(arr[i])) {
newArr = newArr.concat(flatten(arr[i]))
} else {
//不是数组,将其添加到新数组
newArr.push(arr[i])
}
}
return newArr
}
3.reduce迭代
function flatten(arr) {
return arr.reduce((acc, val) => {
return acc.concat(Array.isArray(val) ? flatten(val) : val)
}, [])
}
4.toString和split
toString()会将数字转换为逗号分隔的字符串,再使用split将其转换为数组
function flatten(arr) {
//toString()会将元素转换为字符串类型,调用map(Number)将其转换为数字类型
return arr.toString().split(',').map(Number)
}