JS - 数组扁平化【数组降维】的3种方法

  • 实现数组扁平化【数组降维】
  • 现在有一个数组,对数组做降维处理
      let arr = [
    	[1, 2, 3],
    	[4, 5, 6],
    	12,
    	45,
    	6,
    	[[1, 2, 3], [4, 5, 6], 12, 45, 6],
    	[[1, 2, 3], [4, 5, 6], 12, 45, 6],
    ];
    
  • 方法1
    // 方法1 通过 float 实现对数组的降维
    console.log(arr.flat(Infinity)) // [1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6]
    
  • 方法2 使用普通递归处理
    // 方法2 通过递归的方式去对数组进行降维
    function arrayFlat1(arr) {
        // 定义一个结果数组
        const result = []
        // 定义一个递归函数
        function dealArr(arr) {
            // for 循环遍历数组
            for(let i =0;i<arr.length;i++) {
                // 判断当前成员是不是数组 是数组的话,递归处理,不是数组则push到结果数组中
                Array.isArray(arr[i]) ? dealArr(arr[i])  : result.push(arr[i])
            }
        }
        // 调用递归函数
        dealArr(arr)
        // 返回结果数组
        return result
    }
    
    // 方法2 简写 一个递归
    function arrayFlat2(arr) {
        // 定义一个结果数组
        let result = []
        // 遍历数组
        for (let i = 0; i < arr.length; i++) {
            // 判断传递的数组中的每一项是不是数组,如果是数组,那么就要进行递归处理
            // 因为arrayFlat函数返回值时一个数组,因此可以使用数组拼接的方式进行处理
            result = Array.isArray(arr[i]) ? result.concat(arrayFlat2(arr[i])) : result.concat(arr[i]);
            // 也可以使用下面的方式
            // Array.isArray(arr[i]) ? (result = result.concat(arrayFlat2(arr[i]))) : result.push(arr[i]);
        }
        // 返回结果数组
        return result
    }
    
    console.log(arrayFlat1(arr)) // [1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6]
    console.log(arrayFlat2(arr)) // [1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6]
    
  • 方法3 使用数组方法reduce实现
    // 方法3 使用 reduce实现
    function arrayFlatReduce1(arr) {
        // 返回结果
        return arr.reduce((prev, cur) => {
            // 判断是否为数组 为数组时递归调用
            Array.isArray(cur)
                ? (prev = prev.concat(arrayFlatReduce1(cur)))
                : prev.push(cur);
            return prev;
        }, []);
    }
    
    // 方法3 简写
    function arrayFlatReduce2(arr) {
        return arr.reduce((prev, cur) => {
            return prev.concat(Array.isArray(cur) ? arrayFlatReduce2(cur) : cur)
        }, [])
    }
    
    console.log(arrayFlatReduce1(arr)) // [1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6]
    console.log(arrayFlatReduce2(arr)) // [1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6, 1, 2, 3, 4, 5, 6, 12, 45, 6]
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值