JavaScript 数组展平方法: flat() 和 flatMap()
从 ES2019 中开始引入了一种扁平化数组的新方法,可以展平任何深度的数组。
flat
flat()
方法创建一个新数组,其中所有子数组元素以递归方式连接到特定深度。
语法:array.flat(depth)
- array :
flat()
方法将在给定的数组中使用。 - depth:可选参数,指定展平的深度,默认情况下,深度为
1
。
此方法会按照一个可指定的深度递归遍历数组,并将所有元素与遍历到的子数组中的元素合并为一个新数组返回。
const arr = [[1, 2], [3, 4], 5];
console.log(arr.flat()); // [ 1, 2, 3, 4, 5 ]
flat()
方法也会移除数组中的空项:
const arr = [[1, 2], , [3, 4], 5];
console.log(arr.flat()); // [ 1, 2, 3, 4, 5 ]
在一些复杂的场合,数组的层级不单一比较复杂的情况下,不必去逐个计算数组的嵌套深度,可以借助参数
Infinity
,就可以将所有层级的数组展平。
const arrVeryDeep = [[1, [2, 2, [3, [4, [5, [6]]]]], 1]];
console.log(arrVeryDeep.flat(Infinity)); // [ 1, 2, 2, 3, 4, 5, 6, 1 ]
flatMap
flatMap()
方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 map
连着深度值为 1
的 flat()
几乎相同,但 flatMap()
通常在合并成一种方法的效率稍微高一些。
语法
// Arrow function
flatMap((currentValue) => { ... } )
flatMap((currentValue, index) => { ... } )
flatMap((currentValue, index, array) => { ... } )
// Callback function
flatMap(callbackFn)
flatMap(callbackFn, thisArg)
// Inline callback function
flatMap(function(currentValue) { ... })
flatMap(function(currentValue, index) { ... })
flatMap(function(currentValue, index, array){ ... })
flatMap(function(currentValue, index, array) { ... }, thisArg)
- callbackFn:处理新数组元素的回调函数,接收三个参数
- currentValue:数组中正在处理的当前元素。
- index:可选参数,数组中正在处理的当前元素的索引。
- array:可选参数,调用了数组
map()
。
- thisArg:执行
callbackFn
时用作this
的值
此方法返回一个新数组的值,其中每个元素都是通过回调函数的处理过的结果,并将其展平到深度为 1
。
const userRunning1 = {
movements: [1000, 4500, 500, 1200],
};
const userRunning2 = {
movements: [2000, 4500, 2500, 12000],
};
const userRunning3 = {
movements: [10000, 5000, 1500, 800],
};
const allRunning = [userRunning1, userRunning2, userRunning3];
// flat
const overalDistance = allRunning
.map((acc) => acc.movements)
.flat()
.reduce((acc, mov) => acc + mov, 0);
console.log(overalDistance); // 45500
// flatMap
const overalDistance2 = allRunning
.flatMap((acc) => acc.movements)
.reduce((acc, mov) => acc + mov, 0);
console.log(overalDistance2); // 45500
上述代码通过 flat()
方法和 flatMap()
方法来解决同样问题,将所有用户的跑步记录进行累加。
flatMap()
展平的深度值为1
,而flat()
可以指定多级。
JavaScript 数组展平方法: flat() 和 flatMap()的更多相关文章
- 前端面试之JavaScript中数组的方法!【残缺版!!】
前端面试之JavaScript中数组常用的方法 7 join Array.join()方法将数组中所有元素都转化为字符串并连接在-起,返回最后生成的字 符串.可以指定一个可选的字符串在生成的字符串中来 ...
- JavaScript常用对象的方法和属性
---恢复内容开始--- 本文将简单介绍JavaScript中一些常用对象的属性和方法,以及几个有用的系统函数. 一.串方法 JavaScript有强大的串处理功能,有了这些串方法,才能编写出丰富多彩 ...
- javascript中的splice方法介绍&示例
javascript 中的 splice 方法很强大,它可以用于插入.删除或替换数组的元素. 下面来一一介绍! 删除:用于删除元素,两个参数,第一个参数(要删除第一项的位置),第二个参数(要删除的项数 ...
- Javascript对象属性与方法汇总
Javascript对象属性与方法汇总 发布时间:2015-03-06 编辑:www.jquerycn.cn 详细介绍下,javascript对象属性与对象方法的相关知识,包括javascript字符 ...
- JavaScript对象的valueOf()方法
js对象中的valueOf()方法和toString()方法非常类似,但是,当需要返回对象的原始值而非字符串的时候才调用它,尤其是转换为数字的时候.如果在需要使用原始值的上下文中使用了对象,JavaS ...
- Android和JavaScript相互调用的方法
转载地址:http://www.jb51.net/article/77206.htm 这篇文章主要介绍了Android和JavaScript相互调用的方法,实例分析了Android的WebView执行 ...
- JavaScript document属性和方法
JavaScript document属性和方法 --------------------------------------------属性: 1. Attributes 存储节点的属性列表 ...
- 将JavaScript 插入网页的方法
将JavaScript 插入网页的方法 使用Javascript代码. 插入JavaScript 与在网页中插入CSS的方式相似.使用下面的代码可以在网页中插入JavaScript: ... 其中的. ...
- js 判断数组包含某值的方法 和 javascript数组扩展indexOf()方法
var questionId = []; var anSwerIdValue = []; ////javascript数组扩展indexOf()方法 Array.prototype.indexOf ...
- Javascript调用C#后台方法及JSon解析
Javascript调用C#后台方法及JSon解析 如何使用Ajax 调用C# 后台方法. 本文目录 如何使用Ajax 调用C# 后台方法. 1.后台(.cs)测试方法 2.前台调用(javasc ...
随机推荐
- 部署个SSH蜜罐玩玩,又能增强安全性,又能当电子蛐蛐
前言 最近有个旧服务器的 SSL 证书过期了,每次都申请 SSL 证书太麻烦了,我直接把 swag 方案部署上去. 然后发现这个服务器在安全方面有所疏忽,所以又加固了一下,SSH 部分我想起来之前用过 ...
- 现代IT基础设施管理(1):Terraform初识和小试牛刀
基础设施包括各种云,像国内的阿里云.腾讯云和华为云,国外的AWS.微软Azure云和谷歌云,还有Kubernetes和OpenStack,都可以用Terraform进行资源管理.使用基础设施即代码(I ...
- luckysheet 初始化数据 以及 sheet显示数据
主要说明属性 表格初始化时使用一维数组格式的 celldata,初始化完成后转化为二维数组格式的data作为存储更新使用,celldata不再使用. 如果需要将data拿出来作为初始化数据,则需要执行 ...
- 【一步步开发AI运动小程序】十八、如何识别用户上传图片中的人体、运动、动作、姿态?
[云智AI运动识别小程序插件],可以为您的小程序,赋于人体检测识别.运动检测识别.姿态识别检测AI能力.本地原生识别引擎,内置10余个运动,无需依赖任何后台或第三方服务,有着识别速度快.体验佳.扩展性 ...
- WiFi基础(八):WiFi安全、认证与加密
liwen01 2024.11.17 前言 计算机网络在给人们带来便利的同时,也引入了安全风险,对于无线WiFi网络而言,风险更高.无线 WiFi 网络安全主要包括两大部分:接入认证和数据加密. 虽然 ...
- Myeclipse优化:自动转义字符串中的特殊字符
在Myeclipse或者Eclipse中,将一段带引号(或其他的需要转义)字符串黏贴到引号中,双引号默认不会自动转义,手工一个一个去转义(变成\")的话实在是费事,这里记录一下让Myecli ...
- pikachu文件上传_2024-11-26
什么是文件上传漏洞 文件上传功能在web应用系统很常见,比如很多网站注册的时候需要上传头像.上传附件等等.当用户点击上传按钮后,后台会对上传的文件进行判断 比如是否是指定的类型.后缀名.大小等等,然后 ...
- 设计模式【3.2】-- JDK动态代理源码分析有多香?
前面文章有说到代理模式:http://aphysia.cn/archives/dynamicagentdesignpattern 那么回顾一下,代理模式怎么来的?假设有个需求: 在系统中所有的 con ...
- 移动端PDF阅读器重排版效果对比-小白PDF阅读器与KOReader重排效果对比
PDF是一种跨操作系统平台的电子文件格式,它能在各种不同的平台上以相同的版式显示.很多扫描书籍或者电子书籍都会采用PDF格式存储.但是移动端由于屏幕的限制,以原版展示PDF会导致画面缩放严重,影响阅读 ...
- jackson 中对 null 的处理
前情提要: 在项目中如何将null值转变为空字符串呢? @Configuration public class JacksonConfig { @Bean @Primary @ConditionalO ...