数组扁平化处理的几种方式整理

数组的扁平化处理 即多维数组转化为一维数组;

首先第一种:   reduce+递归;

reduce是数组的一种方法,它接收一个函数作为累加器,数组中的每个值(从左到右)开始缩减,最终计算为一个值。

reduce包含两个参数:回调函数,传给total的初始值

 let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];

const flatten = arr1 => arr1.reduce(

        (acc,val) => acc.concat(Array.isArray(val)? flatten(val):val),[]

)

console.log(flatten(arr1));

第二种:toString().split(',')

这个就比较粗暴了 不过返回值会变成string类型 若是要求数据类型可以在遍历一次强转number;

let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];
function changeArrType(arr1){
    let arr2 = arr1.toString().split(',');
   //let arr2 = arr1.join(',').split(',');  join也可以实现  
    let  newArr = arr2.map((item)=>{    //map方法转number类型  根据自己需要处理
        return Number(item)
    })
    return newArr;
    }
console.log(changeArrType(arr1))

第三种: 递归实现

     遍历每一项,判断是不是数组,是数组就把这项取出来再遍历;

let arr1 = [1,2,3,[4],[5,6],[7,8,[9],[10,11,[12,13,[14]]]]];
let newArr1 = [];
function oneDimensionalArray(arr){
    for(let i=0;i<arr.length;i++){
        if(Array.isArray(arr[i])){
            oneDimensionalArray(arr[i])
        }else{
            newArr1.push(arr[i]);
        }
    }
}
oneDimensionalArray(arr1);
console.log(newArr1);

第四种:ES6的flat方法

 首先flat()默认只会“拉平”一层

let arr = [1,2,[,4,5]]
console.log(arr.flat())

如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数

let arr = [1,2,[3,4,[5,6]]]
let arr1 =  [1,2,[3,4,[5,6,[7,8]]]]
console.log(arr.flat(2),arr1.flat(3))

那么对于不知道急几层嵌套的该怎么办? 细心的同学可以发现 上面的例子中的arr拉伸时

我们传入只要大于2的数字就可以把数组完全拉伸开(arr1的参数需要>=3)。那么问题就好解决了

用Infinity 作为关键字   有兴趣的小伙伴可以去看看实现的代码

let arr = [1,2,3,4,5,[6,7,[8,9,[10,11,[12,13]]]]];
console.log(arr.flat(Infinity))

 

第五种:扩展运算符

 es6的扩展运算符能将二维数组变为一维

[].concat(...[1, 2, [3,4,5]]);

根据这个我们可以自己封装个遍历方法,若arr中含有数组则使用一次扩展运算符,直至没有为止,其思想和第三种一样

let arr1 = [1,2,3,4,5,[6,7,[8,9,[10,11,[12,13]]]]];
function flatten(arr) {
    while(arr.some(item=>Array.isArray(item))) {
        arr = [].concat(...arr);
    }
    return arr;
}
console.log(flatten(arr1))

 

总结:

上述我们一共说了几种方法,仔细发现他们实现的核心都是通过遍历,判断每项是不是数组,

然后通过concat或者新建空数组来拼接或者保存

 

 

 

 

 

 

  • 6
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值