JavaScript 数组 flat() 方法

JavaScript flat() 语法

flat() 是 JavaScript 数组的方法,它可以用来 “打平” 一个数组,也就是实现数组的扁平化。所谓的数组扁平化,指的是将多维数组转化为一维数组,比如将 [1, [2, [3]], 4, [5]] 转化为 [1, 2, 3, 4, 5]。

语法:

arr.flat(depth)

说明:

flat() 方法接收单个参数。

  • depth(可选):表示想要拉平的层数。这个参数可以是正整数或 Infinity,默认值是 1。

比如,flat(1) 表示拉平 1 层,flat(2) 表示拉平 2 层。flat(Infinity) 表示不管有多少层嵌套,都转化成一维数组。

除了 flat() 方法之外,还有一个 flatMap() 方法。对于这两个方法,小伙伴们应该放在一起对比学习。

JavaScript 数组 flatMap() 方法

注意:

  • flat() 方法不会改变原数组,而是返回一个新数组。
  • flat() 方法会直接删除空槽元素。

JavaScript flat() 摘要

属于 JavaScript Array 对象
使用频率
修改原数组
官方文档 查看
MDN 查看

JavaScript flat() 示例

接下来,我们通过几个简单的例子来讲解一下 JavaScript flat() 方法是如何使用的。

示例 1:flat() 基本用法

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

运行结果如下。

[1, 2, [ 3 ], 4, 5]
[1, 2, 3, 4, 5]
[1, 2, 3, 4, 5]

示例 2:不带参数的 flat() 方法

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

运行结果如下。

[ 1, 2, [ 3 ], 4, 5 ]

分析:

arr.flat() 等价于 arr.flat(1),表示只会拉平一层。

示例 3:flat() 删除数组中的 “空槽元素”

const arr = [2, , 6, , 10];
const result = arr.flat();
console.log(arr);
console.log(result);

运行结果如下。

[ 2, <1 empty item>, 6, <1 empty item>, 10 ]
[ 2, 6, 10 ]

深入了解 flat()

在实际开发中,实现数组的扁平化只有在一些特殊的场景才会用到。但在前端面试中,很多面试官却很喜欢拿这个知识点来考,最常见的一个问题就是:请分别使用 ES5 和 ES6 来实现数组的扁平化。

ES6 的方式我们当然知道了,那就是使用 flat(Infinity)。接下来给大家介绍一下 ES5 是怎么实现的。当然,小伙伴也可以先自己尝试思考实现一下,这样更能锻炼自己的能力。

在 ES5 中,如果想要实现数组的扁平化,常见的有以下 3 种方式。

示例 4:递归实现数组扁平化

function flatArr(arr) {
    var resultArr = [];
    arr.forEach(function (item) {
        if (Array.isArray(item)) {
            resultArr = resultArr.concat(flatArr(item));
        } else {
            resultArr = resultArr.concat(item)
        }
    });
    return resultArr;
}

var arr = [1, [2, [3]], 4, [5]];
console.log(flatArr(arr));

运行结果如下。

[1, 2, 3, 4, 5]

分析:

在这个例子中,我们定义了一个函数 flatArr() 用于实现数组的扁平化。在 flatArr() 中,我们首先定义了一个用于保存结果的空数组 resultArr,接下来使用 forEach() 方法对传进来的数组进行遍历。在遍历的过程中,如果是数组,则递归处理;如果不是数组,则添加到 resultArr 中。最后拿到的 resultArr,就是被扁平化的数组了。

示例 5:toString() 方法实现数组扁平化

var arr = [1, [2, [3]], 4, [5]];
var tempArr = arr.toString().split(",");
var resultArr = tempArr.map(function (item) {
    return parseInt(item);
});
console.log(resultArr);

运行结果如下。

[1, 2, 3, 4, 5]

分析:

在这个例子中,arr.toString() 的结果是这样一个字符串:"1, 2, 3, 4, 5"。了解到这一点,接下来就好办了。上面这种方式不仅无法处理非数字类型(如对象、字符串),而且如果数组元素本身包含逗号,还会导致分割错误。因此仅适用于纯数字的简单数组。

示例 6:join() 方法实现数组扁平化

var arr = [1, [2, [3]], 4, [5]];
var tempArr = arr.join().split(",");
var resultArr = tempArr.map(function (item) {
    return parseInt(item);
});
console.log(resultArr);

运行结果如下。

[1, 2, 3, 4, 5]

分析:

在这个例子中,arr.join() 的结果是这样一个字符串:"1, 2, 3, 4, 5",接下来的实现方式就是和 toString() 那个例子一样了。

从上面可以看到,如果数组元素的类型不定,最好的办法还是使用递归实现。在前端面试中,递归这种方式是完全没有问题的,但另外两种方式是存在一定缺陷的。

上一篇: copyWithin()

下一篇: flatMap()

给站长反馈

绿叶网正在不断完善中,小伙伴们如果发现任何问题,还望多多给站长反馈,谢谢!

邮箱:lvyenet@vip.qq.com

「绿叶网」服务号
绿叶网服务号放大
关注服务号,微信也能看教程。
绿叶网服务号