数组拍平也称数组扁平化,就是将数组里面的数组打开,最后合并为一个数组。
var arr = [1,2,[3,4,5,[6,7,8],9],10,[11,12]];
1 递归法
function fn(arr) {
let arr1 = []
arr.forEach((val) => {
if (val instanceof Array) {
arr1 = arr1.concat(fn(val))
} else {
arr1.push(val)
}
})
return arr1
}
2 reduce
function fn(arr) {
return arr.reduce((prev, cur) => {
return prev.concat(Array.isArray(cur) ? fn(cur) : cur)
}, [])
}
3 ES6 flat(Infinity)
flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。比如flat()的参数为2,表示要拉平两层的嵌套数组。
如果不管有多少层嵌套,都要转成一维数组,可以用 Infinity 关键字作为参数。
let arr2 = arr.flat(Infinity)
4 扩展运算符
function fn(arr) {
let arr1 = [];
let bStop = true;
arr.forEach((val) => {
if (Array.isArray(val)) {
arr1.push(...val);
bStop = false
} else {
arr1.push(val)
}
})
if (bStop) {
return arr1;
}
return fn(arr1)
}
5 toString
console.log(arr.toString()) // 1,2,3,4,5,6,7,8,9,10,11,12
let arr1 = arr.toString().split(',').map((val)=>{
return parseInt(val)
})
6 apply
function fn(arr) {
while (arr.some(item => Array.isArray(item))) {
arr = [].concat.apply([], arr);
}
return arr;
}