数组扁平化指得是将一个多维数组转为一维数组
1.使用ES6提供的Array.prototype.flat处理
对于flat,MDN上有详细讲解
1 let arr = [ 2 [1,2,2], 3 [3,4,5,5], 4 [6,7,8,9,[10,11,12,[12,13,[14]]]], 5 15,16 6 ] 7 // flat(depth) depth:指提取嵌套数组的结构深度,默认值为 1。为Infinity时指提取所有的嵌套数组 8 arr = arr.flat(Infinity) 9 console.log(arr); 10 /*输出: [ 11 1, 2, 2, 3, 4, 5, 5, 12 6, 7, 8, 9, 10, 11, 12, 13 12, 13, 14, 15, 16 14 ] */
2.使用toString(),直接把数组转化成字符串即可
值得一提的是:数组.toString()之后,不管该数组有多少级,最后都会变为以逗号分隔的字符串(没有中括号和层级),相当于真的扁平化了
1 arr = arr.toString().split(',').map(item=>Number(item))
将数组转为字符串,再讲字符串split变为数组(这个时候的每一项元素都是字符串),最后将数组中的每一项都转化为number类型
3.使用JSON.stringify
arr = JSON.stringify(arr).replace(/[|]/g,'').split(',').map(item=>Number(item))
4.基于数组的some方法进行判断校验,验证数组中的某项有没有符合函数中提供的规则的
利用Array.from()方法:主要用来判断某个值是否是数组,如果是返回true,否则返回false
1 while(arr.some(item=>Array.from(item))){ 2 arr = [].concat(...arr) //...arr 每次只能展开一级 3 }
5.递归处理
1 ~function(){ 2 function myFlat(){ 3 let res = [], 4 _this = this; 5 let fn = arr => { 6 for(let i = 0;i< arr.length; i++){ 7 let item = arr[i]; 8 if(Array.isArray(item)){//判断是否是数组,如果是递归调用fn() 9 fn(item); 10 continue; 11 } 12 res.push(item) //不是数组则将该项放入res新数组中 13 } 14 } 15 fn(_this) 16 return res 17 } 18 Array.prototype.myFlat = myFlat 19 }() 20 arr = arr.myFlat(); 21 console.log(arr);