//task 1 split方法处理
1 function flattening(arr) { 2 let arr1 = (arr + "").split(","); 3 //此时得到的每一项的字符数组 4 //接着转数字 5 let arr2 = arr1.map(item => { 6 return item * 1; 7 }) 8 return arr2; 9 }
//task 2 递归
1 function flattening(arr, newArr = []) { 2 for (let i = 0; i < arr.length; i++) { 3 if (Array.isArray(arr[i])) { 4 flattening(arr[i], newArr) 5 } else { 6 newArr.push(arr[i]) 7 } 8 } 9 return newArr 10 }
//task 2.1 递归第二种写法
1 function flattening(arr) { 2 var res = []; 3 arr.map(item => { 4 if (Array.isArray(item)) { 5 res = res.concat(flattening(item)); 6 } else { 7 res.push(item); 8 } 9 }); 10 return res; 11 }
//task 3 扩展运算符
1 function flattening(arr) { 2 while (arr.some(item => Array.isArray(item))) { 3 arr = [].concat(...arr) 4 } 5 return arr; 6 }
//task 4 reduce+递归实现
1 function flattening(arr) { 2 let newArr=arr.reduce((prev,cur)=>{ 3 return [].concat(prev,cur) 4 }) 5 6 let flag=newArr.some(item=>Array.isArray(item)) 7 if(flag){ 8 return flattening(newArr); 9 }else{ 10 return newArr 11 } 12 }
其实说了这么多方法 es6有一个封装好的方法可以进行数组扁平化处理
Array.flat();
flat 方法默认没有参数 这时只会降维降一层
可以传数字指定降维次数 传个无穷就是全部展开
flat放法不会改变原数组 并且不支持node运行
顺带提一句合并数组的几种方法
let arr1 = [1, 2];
let arr2 = [3, 4];
concat
arr1 = arr1.concat(arr2);
扩展运算符
arr1 = [...arr1, ...arr2];
或者
arr1.push(...arr2);
当数据小的时候三者没有区别 但是数据特别大的时候 concat性能远远高于其他两个