JavaScript的Array.flat()函数深入探讨
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()函数深入探讨的更多相关文章
- JavaScript之Array常用函数汇总
[20141121]JavaScript之Array常用功能汇总 *:first-child { margin-top: 0 !important; } body>*:last-child { ...
- javascript之Array()数组函数讲解
Array()是一个用来构建数组的内建构造器函数.数组主要由如下三种创建方式: array = new Array() array = new Array([size]) array = new Ar ...
- JavaScript 中Array数组的几个内置函数
本文章内容均参考<JavaScript高级程序设计第三版> 今天在看JavaScript书籍的时候,看到之前没有了解过的JavaScript中Array的几个内置函数对象,为了之后再开发工 ...
- javaScript 新学习:Array.contains 函数
Array.contains 函数 确定指定对象是否是 Array 对象中的元素. 此函数是静态的,可在不创建对象实例的情况下调用. var itemExists = Array.contains(a ...
- JavaScript中的Generator函数
1. 简介 Generator函数时ES6提供的一种异步编程解决方案.Generator语法行为和普通函数完全不同,我们可以把Generator理解为一个包含了多个内部状态的状态机. 执行Genera ...
- JavaScript中Array方法总览
title: JavaScript中Array方法总览 toc: true date: 2018-10-13 12:48:14 push(x) 将x添加到数组最后,可添加多个值,返回数组长度.改变原数 ...
- 借助JavaScript中的时间函数改变Html中Table边框的颜色
借助JavaScript中的时间函数改变Html中Table边框的颜色 <html> <head> <meta http-equiv="Content-Type ...
- 02.JavaScript 面向对象精要--函数
在JavaScript中,函数其实也是对象.是函数不同于其他对象的特点是:函数存在一个被称为[[Call]]的内部属性.[[Call]]属性是函数独有的,表明该对象可以被执行.ECMAScript 定 ...
- 前端学习 第二弹: JavaScript中的一些函数与对象(1)
前端学习 第二弹: JavaScript中的一些函数与对象(1) 1.apply与call函数 每个函数都包含两个非继承而来的方法:apply()和call(). 他们的用途相同,都是在特定的作用域中 ...
- 理解和使用 JavaScript 中的回调函数
理解和使用 JavaScript 中的回调函数 标签: 回调函数指针js 2014-11-25 01:20 11506人阅读 评论(4) 收藏 举报 分类: JavaScript(4) 目录( ...
随机推荐
- 理论+实战,详解Sharding Sphere-jdbc
摘要:Apache ShardingSphere 是一款分布式的数据库生态系统,它包含两大产品:ShardingSphere-Proxy和ShardingSphere-JDBC. 本文分享自华为云社区 ...
- LeetCode-380 O(1)时间插入、删除和获取随机元素
来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/insert-delete-getrandom-o1 题目描述 实现RandomizedSet 类 ...
- Java Agent场景性能测试分析优化经验分享
摘要:本文将以Sermant的SpringBoot 注册插件的性能测试及优化过程为例,分享在Java Agent场景如何进行更好的性能测试优化及在Java Agent下需要着重注意的性能陷阱. 作者: ...
- Word16 供应链的管理论文office真题
1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...
- k8s之 pod调度
案例:确保Pod分配到具有SSD硬盘的节点上 第一步:给节点添加标签 格式:kubectl label nodes <node-name> <label-key>=<la ...
- airtest IDE初级教程
一.简介 AirtestIDE 是一款跨平台的 UI自动化测试编辑器 ,内置了Airtest和Poco的相关插件功能,能够使用它快速简单地编写 Airtest 和 Poco 代码. 1. Airtes ...
- vue.config.js --- vue-cli 4.0配置
// 所有配置请参考 https://cli.vuejs.org/zh/config/ module.exports = { /** * publicPath * hash 模式下可使用 * publ ...
- DOM状态监听(观察者模式)
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Vmware-workstation - Centos8.0扩容磁盘空间 / 目录
1. 软件版本 vmware workstation 15 pro 虚拟机: centos8.0 2.将虚拟机关机选择扩容到多大 3. 进入操作系统,执行lsblk查看sda盘的情况.下图所示,需要 ...
- shell_Day08
数组与字符串: 数组 数组就是一段连续的变量,一段连续的内存存储空间 为了解决变量过多的问题: 在同一类变量中,我们不需要去定义多个名字,而是以数组的方式来定义:(列表) 数组名[索引]=值 定义数组 ...
