【算法】数组扁平化

172 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第1天,点击查看活动详情

对于数组扁平化,例如将 [1,[2],[3,[4]]] 铺平成 [1,2,3,4],es6里提供了 flat 方法,可以很方便地实现,但是除了这个现成的方法,你还知道怎么去实现这个需求吗?

666.jpg

本篇文章就聊聊我所知道的三种方式,废话不多说,开搞!

ppx2.jpg

正文

我所了解的方式有如下三种

  • 递归
  • 利用原生方法组合
  • 利用正则替换

接下来分别说明

qidai.jpeg

递归

这种方式就是利用递归来实现 逐步分解子数组,最终达到整个数组的扁平化,具体代码如下

const arr = [1,[2],[3,[4]]]

function test(arr) {
    const res = []
    function recursion(tmp) {
        for(let i of tmp) {
            if(Array.isArray(i)){
              recursion(i)
            }else {
              res.push(i)
            }
        }
    }
    recursion(arr)
    return res
}

这种方法的关健点就一个,就是 判断遍历到的元素是否是数组

  • 是,那么就利用递归继续进行扫描
  • 不是,就把对应的元素放到结果数组里

就是这么简单

6662.jpg

利用原生方法组合

这种方法代码如下

const arr = [1,[2],[3,[4]]]

function test(arr) {
    return arr.toString().split(',').map(item=>Number(item))
}

这个方式使用三种原生方法的结合

  • toString:这是最关键的方法,利用它,我们直接可以得到一个铺平的数组元素的字符串
  • split:将得到的字符串进行切割,生成数组
  • map:将数组每一项转为数字

利用正则替换

这种方式的代码如下

const arr = [1,[2],[3,[4]]]

function test(arr) {
    return JSON.parse(`[${JSON.stringify(arr).replace(/\[|\]/g,'')}]`)
}

这种方式关键点如下

  • 利用 JSON.stringify 将数组转为字符串形式
  • 利用 replace结合正则,将字符串中的 [] 替换为 空字符串
  • 在最外层加上 []
  • 利用 JSON.parse 将字符串转为数组

结语

不管是在面试还是平常工作中,数组扁平化都是经常会出现的问题,所以我们一定要掌握各种解法,而不是只知道flat方法哦~