likes
comments
collection
share

数组扁平化so easy!妈妈再也不用担心我的学习!

作者站长头像
站长
· 阅读数 75

前言

数组扁平化,编程界的一场空间魔术,就是将嵌套多层的数组变为只有一层的平面数组。想象一下,你手里是一串俄罗斯套娃,扁平化就是优雅地打开所有套娃,把所有小娃娃排成一排。这一过程中,递归、循环或者ES6的flat()方法常常大显身手,让数据处理变得简洁高效,妈妈再也不用担心我迷失在数组的深渊里了。

1.初识递归

数组扁平化so easy!妈妈再也不用担心我的学习!

我们这幅图清楚的给出了递归的计算过程,就是一层一层往里走,然后我们要给出初始值,就是递归的终止条件。最后往前进行回溯。

数组扁平化so easy!妈妈再也不用担心我的学习!

斐波那契数列是递归的经典例子。

2.flat方法

数组扁平化so easy!妈妈再也不用担心我的学习!

js官方打造了一个非常好用的方法,可以直接进行数组的扁平化处理,里面传递的参数是扁平化的处理层数,我们可以直接传入一个Infinity(无穷的),就是不管为多少层,我都给你处理掉。最终返回处理结果[1,2,3,4,5]

3.手搓一个flat方法

数组扁平化so easy!妈妈再也不用担心我的学习!

在手搓这个方法之前我们先认识一下concat数组的拼接方法,作用是把后面的数组元素取出来,拿到前面数组里面去,返回拼接后的新数组,原数组都不改变。打印[1,2,3,4]和[1,2]

数组扁平化so easy!妈妈再也不用担心我的学习!

同样我们也来聊一下数组的解构,我们可以把两个数组进行解构,然后拼接,这个和前面所讲方法的作用是一样的。

手搓1:

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

function flat1(arr) {
  let res = []
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      res = res.concat(flat1(arr[i]))
    } else {
      res.push(arr[i])
    }
  }
  return res
}
console.log(flat1(arr));

手搓2:

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

function flat1(arr) {
  let res = []
  for (let i = 0; i < arr.length; i++) {
    if (Array.isArray(arr[i])) {
      res = [...res, ...flat1(arr[i])]
    } else {
      res.push(arr[i])
    }
  }
  return res
}
console.log(flat1(arr));

接下来我们一起看看,如何手搓。

  1. 首先定义一个数组。
  2. 对传入数组进行遍历。
  3. 如果这个元素属于数组,则我们先进行递归。
  4. 然后和已有数组拼接。
  5. 如果不是数组则直接推入。
  6. 最后我们直接返回。

4.toString()方法

数组扁平化so easy!妈妈再也不用担心我的学习!

我们可以直接采用toString方法数组扁平化之后的字符串,我们将字符串转换为数组,然后处理每个元素为数字即可,但是大家也会发现这个方法是有弊端的,就是数组中出现字符串时会出现NaN。

5.reduce()方法

数组扁平化so easy!妈妈再也不用担心我的学习!

在此之前我们先来认识一下这个方法,里面接收两个参数,而回调函数里接4个参数,通常只用前两个参数,代表之前统计值和当前值,而初始值就是我们的第二个参数。上一轮的总和返回给下一轮作为初始值,最终返回数组元素内的累加。

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

function flat1(arr) {
  return arr.reduce((pre, item) => {
    return pre.concat(Array.isArray(item) ? flat1(item) : item)
  }, [])
}
console.log(flat1(arr));

我们接下来就可以看看这个方法(因为截屏原因,冒号后面接的是item)

  1. 我们对数组里面的元素采用累加。
  2. 给一个初始值[ ]。
  3. 我们判断当前元素是不是数组,如果是则递归调用,不是则返回此数。
  4. 最后取其里面的元素和上一个元素进行拼接。
  5. 返回作为下一个元素要拼接的pre。
  6. 因为是一个递归而且我们要最终值,我们必须把整体的值进行返回。

6. some()方法

数组扁平化so easy!妈妈再也不用担心我的学习!

首先我们要知道some方法返回布尔值,判断每个值,是否至少存在一个满足表达式的结果。如果arr里面至少存在一个大于5的数,就是true

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

function flat1(arr) {
  while (arr.some((item) => Array.isArray(item))) {
    arr = [].concat(...arr)
  }
  return arr
}
console.log(flat1(arr));

这个方法和之前手搓的方法本质上差不多,但是会更加方便一些。

小结

数组扁平化,乃编程术中化繁为简之妙法,旨在将多层次嵌套数组转变为单一维度数组。借助循环、递归或ES6的flat方法,轻松解开数组嵌套之谜团,信息排布一目了然,数据处理由此高效便捷,实为提升代码可读性与执行效率之利器。

转载自:https://juejin.cn/post/7372070947819536411
评论
请登录