const arr = [1,2,3,4,5,[4,5,4,[6]],[7]];
方法一:for of遍历
function flatten1(arr){
const result = [];
for (const arrElement of arr) {
if(Array.isArray(arrElement)){
result.push(...flatten1(arrElement));
}else{
result.push(arrElement);
}
}
return result
}
console.log(flatten1(arr))
方法二:reduce
function flatten2(arr){
return arr.reduce((pre,cur,index)=>{
return pre.concat((Array.isArray(cur)?flatten2(cur):cur))
},[])
}
// console.log(flatten2(arr))
// console.log([1,2,3,4].concat(1,2,3,4,))
// console.log([1,2,3,4].concat(1,[1,2,3,4],7))
- concat可连接单个、多个元素、数组或这几种的组合
- push方法会返回push后的length
方法三:扩展运算符 + Array.some
function flatten3(arr){
while(arr.some(item=>Array.isArray(item))){
arr = [].concat(...arr); // ...arr 点语法已经将扁平化了一层
}
return arr
}
// console.log(flatten3(arr))
- while 通过判断数组中是否存在嵌套数组,存在则解开
- …arr 将arr数组解开成1,2,3,4,[2,3,4],4,[5]的方式,即从外向内扁平化一层
- 该方法会直接作用于原始数组
方法四:toString + split
function flatten4(arr){
return arr.toString().split(',').map(item=>+item)
}
// console.log(flatten4(arr))
toString 方法是Object对象的方法,其他都是基于原型链继承的,所以都会直接将所有形式的参数转换成以逗号分割的字符串。也就是说对于嵌套数组会直接全部展开以逗号连接
方法五:JSON.stringify + RegExp
function flatten5(arr){
// const str = JSON.stringify(arr).replace(/([|])/g,"").split(',').map(item=>+item)
return JSON.parse('['+JSON.stringify(arr).replace(/([|])/g,"")+']')
}
// console.log(flatten5(arr))
// console.log(Array.isArray(flatten5(arr)))
将数组序列化,然后使用正则匹配字符串中的 [ 和 ] ,将其变成空即可,然后反序列化回来
方法六:Array.flat
function flatten6(arr){
return arr.flat(Infinity)
}
console.log(flatten6(arr))
console.log(Array.isArray(flatten6(arr)))
使用Array.flat原生方法,使用参数Infinity表示扁平层数为无穷,即扁平到没有嵌套数组即可