0.es6新增的 Array.prototype.flat() 方法,创建一个新的数组,并根据指定深度递归地将所有子数组元素拼接到新的数组中。
它有一个参数,指定要提取嵌套数组的结构深度,默认值为 1;如果不管有多少层嵌套,都要转成一维数组,可以用 Infinity 关键字作为参数。
function flatArr(arr) {
return arr.flat(Infinity)
}
let arr = [1, 2, 3, [4, 5, 6, [7, 8, [9]]]]
let res = flatArr(arr)
console.log(res); // [1,2,3,4,5,6,7,8,9]
1.递归实现,遍历数组判断数组中的元素是否为数组,如果是那就把该元素递归拼接到新数组上并赋值给新数组,否则就把该元素添加到新数组上。
function flatArr2(arr) {
let result = []
for (let i = 0; i < arr.length; i++) {
if (Array.isArray(arr[i])) {
result = result.concat(flatArr2(arr[i]))
} else {
result.push(arr[i])
}
}
return result
}
let arr = [1, 2, 3, [4, 5, 6, [7, 8, [9]]]]
let res = flatArr2(arr)
console.log(res);
2.reduce函数实现
function flatArr3(arr) {
return arr.reduce((pre, cur) => {
return pre.concat(Array.isArray(cur) ? flatArr3(cur) : cur)
}, [])
}
let arr = [1, 2, 3, [4, 5, 6, [7, 8, [9]]]]
let res = flatArr3(arr)
console.log(res);
3.通过扩展运算符和while循环实现
function flatArr4(arr) {
while (arr.some(el => Array.isArray(el))) {
arr = [].concat(...arr)
}
return arr
}
let arr = [1, 2, 3, [4, 5, 6, [7, 8, [9]]]]
let res = flatArr4(arr)
console.log(res);
4.通过把数组转为字符串,然后以逗号分割为数组,再根据回调函数转成想要的数组
function flatArr5(arr) {
return arr.toString().split(',').map(el => Number(el))
}
let arr = [1, 2, 3, [4, 5, 6, [7, 8, [9]]]]
let res = flatArr5(arr)
console.log(res);