实现数组扁平,这里绝对有你没见过的方法

97 阅读4分钟

开篇前言:

最近一直在研究一些好操作,结合自己的理解,针对数组扁平总结了如下七种方法:

  • 递归法
  • flat实现法
  • reduce实现法
  • findIndex + splice 实现法
  • stack实现法
  • 正则法
  • toString特性法

相信我,实现数组扁平的方法这里肯定有你 没见过 或者说 不熟悉 的解法

递归法

分析:递归法这可能是很多人都知道并且会的一种解法,不多说直接上代码

const temp = []
function myFlat(arr) {
  arr.forEach(item => {
    if (Array.isArray(item)) {
      myFlat(item)
    } else {
      temp.push(item)
    }
  })
  return temp
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

当然,这种写法存在一个弊端,就是在全局定义了一个temp空数组,不利于维护。我们可以这么去优化一下,把 temp 定义在函数的第二个参数,然后递归作为第二个参数传进去,代码如下:

 function myFlat(arr, temp = []) {
   arr.forEach(item => {
     if (Array.isArray(item)) {
       myFlat(item, temp)
     } else {
       temp.push(item)
     }
   })
   return temp
 }

 const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
 const res = myFlat(arr)
 console.log(res);

flat 实现法

分析:这无非是最简单的一种实现方法,数组自带了一个方法叫做 flat, 该方法专门用来扁平数组的,不多说直接上代码

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = arr.flat(3)
console.log(res);

当然,flat 方法还可以直接传 Infinity,这样不管多少层都能扁平,代码如下:

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = arr.flat(Infinity)
console.log(res);

reduce 实现法

分析:该方法主要结合了数组的 concat 方法 以及 递归 来实现的 ,不多说直接上代码

function myFlat(arr) {
  return arr.reduce((t, v) => {
    return Array.isArray(v) ? t.concat(myFlat(v)) : t.concat(v)
  }, [])
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

findIndex + splice 实现法

分析: 该方法可能稍微难想到一点,不多说直接上代码

function myFlat(arr) {
  while(true) {
    const index = arr.findIndex(item => Array.isArray(item))
    if (index === -1) return arr
    arr.splice(index, 1, ...arr[index])
  }
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

stack实现法

分析:stack 就是栈,是一种算法思想,对算法研究的比较多的同学相信对这个栈应该不陌生。具体思路:在这里首先准备两个栈,我们把它叫作 a栈b栈,然后把原数据全部放入a栈中,根据栈的 进出原则,一出就判断该数据是否为数组,不是数组就放入b栈中,是数组则再拆包一次重新放回a栈中,以此类推,不多说直接上代码

function myFlat(arr) {
  const a = [...arr]
  const b = []

  while(a.length) {
    const val = a.pop()
    if (Array.isArray(val)) {
      a.push(...val)
    } else {
      b.push(val)
    }
  }

  return b.reverse()
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

上述代码 还可以把 reverse 去掉,将 pop 改成 shift, a.push 改成 a.unshift 也可以保证顺序。

正则法

分析:这种方法呢看着很简单,但一般人可能想不到这么去做。原理就是利用 JSON.stringify 把数组转化成字符串,然后利用 replace 方法把括号全部去掉,最后利用 JSON.parse 再转成数组,不多说直接上代码

function myFlat(arr) {
  const res = JSON.stringify(arr).replace(/\[|\]/g, '')
  return JSON.parse('[' + res + ']')
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

toString特性法

分析,这种方法也是很简单的一种实现方法,但可能很多人也不容易想到,但是如果你很清楚 toString 有这么一个特性的话,那想必你就容易想到这么去做。那 toString 到底有什么特性呢,竟然可以实现数组扁平,那就是数组只要调用 toString 方法,不管数组有多少层,都能全部进行扁平,你可能会想,啊,有这么神奇吗,只用实力说法,请看如下代码

function myFlat(arr) {
   const res = arr.toString()
   return JSON.parse('[' + res + ']')
}

const arr = [1, [1, 2], [1, [3, 4, [5, 6]]]]
const res = myFlat(arr)
console.log(res);

好了,实现数组扁平的 七种方法 到此已全部概述完了,各位大佬如果还有补充的方法 或者 哪里有疑问的地方,欢迎在评论区进行留言 !

这是作者在掘金发表的首篇文章,各位如果觉得写的还行的话,可以帮我点一个小赞哦,谢谢大家了!本人后续会出更多的文章,大家也可以期待一下哦 !