js数组扁平化的六种方法

QQ图片20220330113718.gif
我也不知道为什么要整理这么多种方法,
算是拓展个思路吧。🤦‍♂️

let array = [1, [2, 34, [12, 4]], 23];

1.递归遍历

function flatten1(array) {
    let result = []
    for (const item of array) {
        if (Array.isArray(item)) {
            result = result.concat(flatten1(item))
        } else {
            result.push(item)
        }
    }
    return result
}
flatten1(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

2. Array.prototype.reduce()

  • reduce() 方法对数组中的每个元素按序执行一个由您提供的 reducer 函数,每一次运行 reducer 会将先前元素的计算结果作为参数传入,最后将其结果汇总为单个返回值。
  • 第一次执行回调函数时,不存在“上一次的计算结果”。如果需要回调函数从数组索引为 0 的元素开始执行,则需要传递初始值。
  • 否则,数组索引为 0 的元素将被作为初始值 initialValue,迭代器将从第二个元素开始执行(索引为 1 而不是 0)。
function flatten2(array) {
   let result = array.reduce((pre, current) => {
       if (Array.isArray(current)) {
           return pre.concat(flatten2(current))
       } else {
           return pre.concat(current)
       }
   }, [])
   return result
}
flatten2(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

3.Array.prototype.findIndex()

  • findIndex()方法返回数组中满足提供的测试函数的第一个元素的索引。若没有找到对应元素则返回-1。
function flatten3(array) {
   while (array.findIndex((item) => Array.isArray(item) > 0) !== -1) {
       array = [].concat(...array)
   }
   return Array.from(new Set(array))
}
flatten3(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

4.强制类型转换

function flatten4(array) {
    return array.toString().split(',').map(item => Number(item)) 
    // 'array.toString() 转换后的结果 1,2,34,12,4,23'
}
flatten4(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

5.正则表达式

function flatten5(array) {
    let result = JSON.stringify(array); 
    // JSON.stringify 转换后的结果 '[1,[2,34,[12,4]],23]'
    result = result.replace(/(\[|\])/g, '');
    return JSON.parse(`[${result}]`)
}
flatten5(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

6.栈

  • 创建一个栈的结构,一个空数组,然后遍历栈结构,判断如果是数组,使用扩展运算符展开再次扔入栈中,如果不是就往新创建的数组头部增加。
function flatten6(arr) {
    let res = [];
    const stack = [].concat(arr);
    while (stack.length > 0) {
        // pop()方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。
        const item = stack.pop();
        if (Array.isArray(item)) {
            /**
             * push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。
             * 用扩展运算符展开一层 
             */
            stack.push(...item);
        } else {
            // unshift() 方法将一个或多个元素添加到数组的开头,并返回该数组的新长度(该方法修改原有数组)。
            item !== undefined && res.unshift(item);
        }
    }
    return res;
}
flatten6(array)  // result: [ 1, 2, 34, 12, 4, 23 ]

7.Array.prototype.flat()

  • flat(depth) 方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
  • depth 可选参数 指定要提取嵌套数组的结构深度,默认值为 1。
  • 使用 Infinity,可展开任意深度的嵌套数组
 function flatten7(array){
     return array.flat(Infinity)
 }
flatten7(array)  // result: [ 1, 2, 34, 12, 4, 23 ]
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值