JavaScript的Array.flat()函数深入探讨

在过去的几年中,已经将许多有用的功能添加到Javascript Array全局对象中,这些功能为开发人员在编写可用于数组的代码时提供了多种选择。这些功能提供了许多优点,其中最值得注意的是,虽然在过去的一段时间里,开发人员必须实现自己的复杂逻辑来执行各种数组操作,但现在这些新功能已经不再需要这种自制的实现。本文将探讨的有用功能之一是 flat() 函数。

功能概述

flat() 函数提供了将一组数组项串联成一个全新的数组并在函数完成后返回新数组的能力。由于这个函数产生了一个全新的数组,所以一旦函数完成操作后,任何包含在原始数组中的现有的、完全独立的数组都不会被改变,在开始操作之前,不需要采取任何预防措施。

flat() 函数仅采用一个参数,该参数是可选的,唯一的参数是 depth 参数。如果原始数组包含一个或多个嵌套数组结构,则此参数决定函数将多少数组层压扁为单个层。由于该参数是可选的,所以它的默认值为 1,并且在函数完成时,只有单层数组将被平展到返回的全新数组中。

没有参数的情况

在介绍了一般的函数行为之后,让我们看一下 flat() 函数在实践中是如何工作的一些示例。以下示例说明了未指定参数值的情况:

var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat();
// array2: [1, 2, 3, 4, [5, 6], [[7, 8]], [[[9, 10]]]]

调用 flat() 函数时不带参数值。考虑到可选参数的默认值,此函数调用与 flat(1) 相同。这意味着原始数组中深度为 1 的任何数组都将被完全展平,以便将其所有内容单独连接到新数组。原始数组中深度为 2 或更大的任何数组的深度都将减小 1 ,并且这些数组中深度为1的任何单个数组项将单独连接到新数组。结果,原始数组中包含 3 4 的第一个数组被展平,以便将这两个数组项分别连接到新数组。此外,其余三个嵌套的数组中的每个数组都被串联到新的数组中,其嵌套深度减少了一个。

正深度

以下示例演示了指定正 depth 参数值的情况:

var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(2);
// array2: [1, 2, 3, 4, 5, 6, [7, 8], [[9, 10]]]

使用深度参数值 2 调用 flat() 函数。这意味着在原始数组中深度最大为2的任何数组都将被完全展平,以便将其所有内容单独连接到新数组。原始数组中深度为3或更大的任何数组的深度将减少2,并且这些数组中深度为1或2的任何单个数组项将单独连接到新数组。结果,包含 3 4 以及 5 6 的原始数组中的前两个数组被展平,从而将这四个数组项分别连接到新数组。另外,剩下的两个嵌套数组都连接到新数组,它们的嵌套深度减少了2。

无限深度

以下示例演示了指定无限 depth 参数值的情况:

var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(Infinity);
// array2: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

使用 depth 参数值 Infinity 调用 flat() 函数。这意味着原始数组中具有任何深度的所有数组都将被展平,以便将其所有内容单独连接到新数组。在与 flat() 函数一起使用诸如 Infinity 之类的值时,要记住的一件非常重要的事情是,如果应用程序遇到嵌套得足够深的数组,则它可能会耗尽内存。尽管此处使用 Infinity 来证明可以将这种值与 flat() 函数一起使用,但建议使用更小的有限参数值,以避免应用程序中发生任何无法预料的错误。

零深度

以下示例演示了将 depth 参数值指定为 0 的情况:

var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(0);
// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]

使用深度参数值 0 调用 flat() 函数。这意味着原始数组中包含的任何数组都不会被展平,并且新数组的单个数组项和嵌套数组的组成与原始数组完全相同。

负深度

以下示例演示了指定负深度参数值的情况:

var array1 = [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]];
var array2 = array1.flat(-Infinity);
// array2: [1, 2, [3, 4], [[5, 6]], [[[7, 8]]], [[[[9, 10]]]]]

使用 depth 参数值 -Infinity 调用 flat() 函数。由于负深度值对于扁平嵌套数组没有意义,所以在指定负深度参数值的情况下,将使用 0 作为替代。正如前面的示例所演示的那样,当指定深度参数值为 0 时,原始数组中没有数组是扁平的,而新数组中各个数组项和嵌套数组的组成与原始数组完全相同。

经验教训

关于 flat() 函数,可以从本文中学到一些经验教训。首先要记住的是,flat() 函数不会以任何方式改变原始数组中的任何普通或嵌套数组,因此在使用该函数之前无需维护这些数组的状态。flat() 函数唯一会改变的数组是函数完成后返回的全新数组,它只是使用原始数组的所有内容构建的。

要记住的第二件事是,flat() 函数将删除原始数组中存在的所有空值。下面的示例演示了该功能的实际作用:

var array1 = [1, , 3, , 5];
var array2 = array1.flat();
// array2: [1, 3, 5]

尽管原始数组占用了五个位置,而第二个和第四个位置的值未定义,但是 flat() 函数从函数完成后返回的新数组中删除了这两个数组项。结果,新数组只包含三个数组项,它们的值不为 undefined

关于 flat() 函数要记住的第三件事,也是最后一件事,是它的一般用途,以及它如何有助于简化逻辑,如果没有一个可用的 flat()函数,要合并任何数组中包含的所有项目,通常的方法是编写自定义的逻辑来迭代所有的数组,从一个数组中单独拉出项目,然后把它们放到另一个数组中,可能会考虑到其中的嵌套数组。这样的逻辑往往比较混乱,而且容易出错,因此,通过使用抽象的内置函数(如 flat() 函数)来避免它的出现,是一个很好的选择。

 
转发

@杭州程序员小张

JavaScript的Array.flat()函数深入探讨

0/2000字

 

JavaScript的Array.flat()函数深入探讨的更多相关文章

  1. JavaScript之Array常用函数汇总

    [20141121]JavaScript之Array常用功能汇总 *:first-child { margin-top: 0 !important; } body>*:last-child { ...

  2. javascript之Array()数组函数讲解

    Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array = new Array([size]) array = new Ar ...

  3. JavaScript 中Array数组的几个内置函数

    本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工 ...

  4. javaScript 新学习:Array.contains 函数

    Array.contains 函数 确定指定对象是否是 Array 对象中的元素. 此函数是静态的,可在不创建对象实例的情况下调用. var itemExists = Array.contains(a ...

  5. JavaScript中的Generator函数

    1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...

  6. JavaScript中Array方法总览

    title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...

  7. 借助JavaScript中的时间函数改变Html中Table边框的颜色

    借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...

  8. 02.JavaScript 面向对象精要--函数

    在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定 ...

  9. 前端学习 第二弹: JavaScript中的一些函数与对象(1)

    前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...

  10. 理解和使用 JavaScript 中的回调函数

    理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报  分类: JavaScript(4)    目录( ...

随机推荐

  1. 自己动手从零写桌面操作系统GrapeOS系列教程——7.计算机组成与运行原理

    学习操作系统原理最好的方法是自己写一个简单的操作系统. 在大学计算机课程中会学到一个叫冯·诺依曼结构的东西,很多同学当时学的也不是很清楚,也就是记住冯·诺依曼结构中五个部分的名称,能应付考试.主要原因 ...

  2. 计网学习笔记二 Link Layer Service

    在上一周的计网学习了network和Internet的总论.在这一周开始的未来几讲将集中在链路层link layer,并且会有相应的计网lab完成.在这一讲中,我们主要关注链路层提供的服务. 课程资料 ...

  3. jQuery使用与语法

    jQuery安装 1.从官网Download jQuery | jQuery下载安装: 2.CDN在线加载: statistic CDN:https://cdn.staticfile.org/jque ...

  4. go 语言 for循环的一个坑

    1.案例1 package main import "fmt" type Card struct { id int } func main() { list := make([]* ...

  5. vue3中对于/deep/和::v-deep的警告信息处理

    目前发现两处警告信息: ::v-deep usage as a combinator has been deprecated. Use :deep() instead. the >>> ...

  6. 微信小程序tabBar不显示的问题

    刚刚入门 随便试吧了几个小功能.在用到tabBar时,在未出现代码错误的情况下,tabBar不显示 后来改了改发现是打开的首页并没有包含在tabBar列表里.

  7. 在centos环境下利用docker安装kail

    配置好国内阿里云镜像 vim  /etc/docker/daemon.json {"registry-mirrors":["https://cq20bk8v.mirror ...

  8. VSCode配置 关于丢失VSCode默认启动终端一事

    在配置前端开发环境的时候碰到一个VSCode 的配置问题,在VSCode 中启用项目的时候,发现默认终端(PowerShell)是空的 项目无法启动,这时候需要自己选择终端 git Bash :自己安 ...

  9. mysql 当年所有月份列表

    -- 不依赖任何表,只是用mysql自带函数方法select concat((select year(now())),'-01') as `date`union select concat((sele ...

  10. iOS开发之各机型屏幕大小与键盘高度整理

    机型 屏幕宽 屏幕高 键盘高 iPhone 8 375 667 260 iPhone 8 Plus 414 736 271 iPhone X 375 812 336 iPhone Xs 375 812 ...