js数组扁平化

89 阅读2分钟

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

数组扁平化概念

数组中的元素是多样性的,可以是一个值,也可以是一个嵌套的数组,例如,数组[1,2]中的所有元素都是一个数字,元素中不存在嵌套,这就是一个一维数组;而数组[[1,2],[3,4]]中的元素又是一个数组,元素中存在嵌套就是一个二维数组;如果嵌套数组中的元素继续嵌套,层级依次加深,数组维数也依次增加。

数组扁平化就是把多维数组转化成一维数组的过程,例如,二维数组[[1,2],[3,4]]变成一维数组[1,2,3,4]就是数组扁平化。

数组扁平化方法——Array.flat()函数

ES6中在数组的实例方法中增加了flat()方法,该方法就是将嵌套的数组拉平变成一维的数组,如下:

[1, [2, 3]].flat()
// [1, 2, 3]

flat()方法默认是只能拉平一层嵌套的数组,如果有多层嵌套的数组就需要传入一个嵌套层级的参数,如下:

[1, [2, [3, 4]]].flat()
// [1, 2, [3, 4]]

[1, [2, [3, 4]]].flat(2)
// [1, 2, 3, 4]

如上代码所示,对于有2层嵌套的数组[1, [2, [3, 4]]]如果直接使用flat()函数,结果[1, 2, [3, 4]]仍然有一层嵌套,但如果在flat函数中传入需要拉平的层级2(也就是嵌套的层级),结果就变成了一维数组[1, 2, 3, 4]。

flat()方法相对应的有一个flatMap()方法,flatMap方法它会对数组中的每一个元素执行map函数,然后再对返回值组成的数组执行flat()方法,其用法如下:

[2, 3].flatMap((x) => [x, x * 2])
// 相当于[[2,4],[3,6]].flat()
// [2, 4, 3, 6]

[2, 3].flatMap((x) => [[x * 2]])
// 相当于[[[4]],[[6]]].flat()
// [[4], [6]]

如上,第一个例子中,数组[2, 3]使用flatMap方法时,首先是数组中的元素执行flatMap中的回调方法,这时候会返回[2,4]和[3,6],然后这两个返回值组成新数组[[2,4],[3,6]]执行flat()方法,结果即是[2, 4, 3, 6]。第二个例子中遍历时返回的是二维数组[[4]]和[[6]],将这两个数组组合成新数组再执行flat(),即是结果[[4], [6]]。