JavaScript Array.flat()函数用法解析


Posted in Javascript onSeptember 02, 2020

在过去的几年中,已经将许多有用的功能添加到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 相关文章推荐
THREE.JS入门教程(6)创建自己的全景图实现步骤
Jan 25 Javascript
js 事件截取enter按键页面提交事件示例代码
Mar 04 Javascript
Javascript中的call()方法介绍
Mar 15 Javascript
javascript每日必学之条件分支
Feb 17 Javascript
JS组件Bootstrap按钮组与下拉按钮详解
May 10 Javascript
jQuery插件FusionCharts实现的MSBar3D图效果示例【附demo源码】
Mar 23 jQuery
详解Vue使用 vue-cli 搭建项目
Apr 20 Javascript
jQuery实现监听下拉框选中内容发生改变操作示例
Jul 13 jQuery
react 兄弟组件如何调用对方的方法示例
Oct 23 Javascript
Vue项目总结之webpack常规打包优化方案
Jun 06 Javascript
js实现整体缩放页面适配移动端
Mar 31 Javascript
vue实现在data里引入相对路径
Jun 05 Vue.js
通过实例解析JavaScript常用排序算法
Sep 02 #Javascript
手把手教你实现 Promise的使用方法
Sep 02 #Javascript
如何基于jQuery实现五角星评分
Sep 02 #jQuery
在vscode 中设置 vue模板内容的方法
Sep 02 #Javascript
JavaScript array常用方法代码实例详解
Sep 02 #Javascript
Vue前端判断数据对象是否为空的实例
Sep 02 #Javascript
详解JavaScript 事件流
Sep 02 #Javascript
You might like
PL-880隐藏功能
2021/03/01 无线电
用来给图片加水印的PHP类
2008/04/09 PHP
PHP批量去除BOM头内容信息代码
2016/03/11 PHP
PHP数学运算与数据处理实例分析
2016/04/01 PHP
Laravel 5.3 学习笔记之 配置
2016/08/28 PHP
PHP匿名函数(闭包函数)详解
2019/03/22 PHP
javascript面向对象之Javascript 继承
2010/05/04 Javascript
js实现倒计时(距离结束还有)示例代码
2013/07/24 Javascript
10分钟学会写Jquery插件实例教程
2014/09/06 Javascript
jQuery中replaceWith()方法用法实例
2014/12/25 Javascript
日常收藏的jquery技巧
2015/12/02 Javascript
Highcharts使用简例及异步动态读取数据
2015/12/30 Javascript
jQuery Easyui实现左右布局
2016/01/26 Javascript
如何在Linux上安装Node.js
2016/04/01 Javascript
JS把内容动态插入到DIV的实现方法
2016/07/19 Javascript
javascript 闭包详解及简单实例应用
2016/12/31 Javascript
JavaScript登录记住密码操作(超简单代码)
2017/03/22 Javascript
ES6新增的math,Number方法
2017/08/06 Javascript
基于vue-cli npm run build之后vendor.js文件过大的解决方法
2018/09/27 Javascript
node.js中express模块创建服务器和http模块客户端发请求
2019/03/06 Javascript
layer.prompt输入层的例子
2019/09/24 Javascript
JavaScript鼠标拖拽事件详解
2020/04/03 Javascript
Vue封装Axios请求和拦截器的步骤
2020/09/16 Javascript
微信小程序tab左右滑动切换功能的实现代码
2021/02/08 Javascript
python获取从命令行输入数字的方法
2015/04/29 Python
Python KMeans聚类问题分析
2018/02/23 Python
python @classmethod 的使用场合详解
2019/08/23 Python
pytorch中的自定义反向传播,求导实例
2020/01/06 Python
Python内置函数locals和globals对比
2020/04/28 Python
使用Keras预训练模型ResNet50进行图像分类方式
2020/05/23 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
一款超酷的js+css3实现的3D标签云特效兼容ie7/8/9
2013/11/18 HTML / CSS
智能电子应届生求职信
2013/11/10 职场文书
民用住房租房协议书
2014/10/29 职场文书
承诺书范本大全
2015/05/04 职场文书
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python