ES6中flat与flatMap使用

news2024/10/7 14:34:11

1、方法介绍

数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。

[1, 2, [3, 4]].flat()
// [1, 2, 3, 4]

上面代码中,原数组的成员里面有一个数组,flat()方法将子数组的成员取出来,添加在原来的位置。

flat()默认只会“拉平”一层,如果想要“拉平”多层的嵌套数组,可以将flat()方法的参数写成一个整数,表示想要拉平的层数,默认为1。

[1, 2, [3, [4, 5]]].flat()
// [1, 2, 3, [4, 5]]

[1, 2, [3, [4, 5]]].flat(2)
// [1, 2, 3, 4, 5]

上面代码中,flat()的参数为2,表示要“拉平”两层的嵌套数组。

如果不管有多少层嵌套,都要转成一维数组,可以用Infinity关键字作为参数。

[1, [2, [3]]].flat(Infinity)
// [1, 2, 3]

如果原数组有空位,flat()方法会跳过空位。

[1, 2, , 4, 5].flat()
// [1, 2, 4, 5]

flatMap()方法对原数组的每个成员执行一个函数(相当于执行Array.prototype.map()),然后对返回值组成的数组执行flat()方法。该方法返回一个新数组,不改变原数组。

// 相当于 [[2, 4], [3, 6], [4, 8]].flat()
[2, 3, 4].flatMap((x) => [x, x * 2])
// [2, 4, 3, 6, 4, 8]

flatMap()只能展开一层数组。

// 相当于 [[[2]], [[4]], [[6]], [[8]]].flat()
[1, 2, 3, 4].flatMap(x => [[x * 2]])
// [[2], [4], [6], [8]]

上面代码中,遍历函数返回的是一个双层的数组,但是默认只能展开一层,因此flatMap()返回的还是一个嵌套数组。

flatMap()方法的参数是一个遍历函数,该函数可以接受三个参数,分别是当前数组成员、当前数组成员的位置(从零开始)、原数组。

arr.flatMap(function callback(currentValue[, index[, array]]) {
  // ...
}[, thisArg])

flatMap()方法还可以有第二个参数,用来绑定遍历函数里面的this。

2、实例应用

增加元素:

// 增加元素
const msgArr = ["it's Sunny in", "California"];
 
const newArr = msgArr.flatMap(i => i.split(' '))
console.log(newArr); //   ["it's", "Sunny", "in", "California"]

删除元素:

// 删除元素
const arr = [1, 2, 3, 4]
	
const newArr = arr.flatMap(x => x % 2 === 0 ? [x]: [])
	
console.log(newArr); // [2, 4]

修改元素:

// 修改元素
const arr = [1, 2, 3, 4]
	
const newArr = arr.flatMap(x => [x * 2])
	
console.log(newArr); // [2, 4, 6, 8]

flatMap方法结合实际场景的使用:
下面我们来看一个实际的例子:例如我们现在有一个选择公司的Select下拉组件,但是后端接口返回的公司列表里面的每一项的字段和我们Select下拉组件需要的字段格式不一样,而且我们还有一个特殊的要求,就是已授权的公司我们才允许在Select下拉组件中选择。这时候我们就想办法遍历公司列表,然后先把未授权的公司过滤掉,然后再把每一项转换成Select下拉组件所需要的数据格式。

这是我们最后展示的公司下拉组件:
在这里插入图片描述
接口返回的公司列表数据结构如下:

	/**
	 * 后端接口返回的公司列表数据:
	 * 	Id: 公司的唯一ID
	 *  Name: 公司名称
	 * 	Authorized: 是否已经授权: 1:已授权,2:未授权
	 * 
	 */
	
	const studioList = [
		{
			Authorized: "2",
			CompanyType: "1",
			Id: "3729",
			Name: "阿我打完的",
			ServiceProviderId: "6",
			TenantId: "1",
		},
		{
			Authorized: "1",
			CompanyType: "1",
			Id: "3134",
			Name: "纳税统计-启用时间202101无期初",
			ServiceProviderId: "6",
			TenantId: "1",
		},
		{
			Authorized: "1",
			CompanyType: "1",
			Id: "427",
			Name: "美丽人生工作室",
			ServiceProviderId: "6",
			TenantId: "1",
		},
		{
			Authorized: "1",
			CompanyType: "1",
			Id: "410",
			Name: "凭证测试专用2",
			ServiceProviderId: "6",
			TenantId: "1",
		}
	]	

选择公司的Select下拉组件需要的数据格式如下:

    [
		{
			text: '公司名称',
			value: '公司ID'
		}
	]

接下来我们就需要把Authorized等于2的过滤掉,然后再转换成Select下拉组件需要的格式,

我们先使用filter配合map来实现:

const filterList = studioList.filter(r => r.Authorized === '1').map(i => ({text: i.Name, value: i.Id}))
	
// 最终也是可以得到我们想要的数据的:[{text: "纳税统计-启用时间202101无期初",value: "3134"},{text: "美丽人生工作室",value: "427"},{text: "凭证测试专用2",value: "410"}]
console.log(filterList);

但是使用filter配合map来实现看起来不是那么简洁易读,下面我们使用flatMap方法来替代:

const filterList = studioList.flatMap(r => r.Authorized === '1' ? [{text: r.Name, value: r.Id}] : [])

最终也是得到一样的结果的,但是flatMap用起来更简洁易读一些。

假设我们有以下购物车:

let cart = [
    {
        name: "Smartphone",
        qty: 2,
        price: 500,
        freeOfCharge: false,
    },
    {
        name: "Tablet",
        qty: 1,
        price: 800,
        freeOfCharge: false,
    },
];

如果客户购买智能手机,我们想给送他们免费的屏幕保护膜。
当客户将智能手机添加到购物车时,我们可以使用 flatMap() 方法将屏幕保护膜添加到购物车,如下所示:

let newCart = cart.flatMap((item) => {
    if (item.name === "Smartphone") {
        return [
            item,
            {
                name: "Screen Protector",
                qty: item.qty,
                price: 5,
                freeOfCharge: true,
            },
        ];
    } else {
        return [item];
    }
});
console.log(newCart);

购物车将如下所示:

[
    { name: 'Smartphone', qty: 2, price: 500, freeOfCharge: false },
    { name: 'Screen Protector', qty: 2, price: 5, freeOfCharge: true },
    { name: 'Tablet', qty: 1, price: 800, freeOfCharge: false }
]

下面使用 reduce() 方法计算购物车中商品的总金额, 它忽略了免费项目,例如屏幕保护膜:

const total = newCart.reduce((sum, item) => {
    if (!item.freeOfCharge) sum += item.price * item.qty;
    return sum;
}, 0);
console.log({ total });

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/543423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

InnoDB数据页结构

什么是页?什么是数据页? 页是InnoDB管理存储空间的基本单元,一个页的大小一般是16k。 InnoDB有许多不同的页,有存放表空间头部信息的页,INODE信息的页,当然还有存放我们记录信息的页,这个页叫…

【苹果】Apple Store 更换ID教程

在此之前需要准备的项目: 一台苹果手机【教程环境:ios15 in iPhone11】一个新的苹果ID账号一个具备完整阅读能力愿意看完教程的人 教程开始 第一步:解锁您的 iPhone 第二步:打开你的应用商店 第三步:点击右上角头像…

Linux驱动快速入门(vscode的使用)

vscode精确跳转前提: 1、安装了clangd插件 2、禁止了c/c intellisense: 3、在Linux内核源码首目录下有compile_commands.json文件,且这个文件内容“cc”改为了“xxxx-gcc”,后先清理之前编译的,后用bear make编译。…

ChatGPT官方APP上线:速度极快且免费、增加语音识别,网友:真香

安卓版也马上要来。 很强大,很简洁,而且它太快了。 这就是人们对几小时前 OpenAI 发布的 ChatGPT 官方版 App 的评价: ChatGPT 推出近半年以来,已经从新鲜的事物成为改变整个科技领域的推手。有机构统计认为,早在今年…

【手撕代码系列】JS手写实现深拷贝

公众号:Code程序人生,分享前端所见所闻 深拷贝是在计算机科学中非常重要的概念,尤其是在处理数据结构和对象的时候。深拷贝的目的是创建一个新的对象,它有自己的内存空间,并且其中的所有值都是原始对象的副本。这样做的…

某大型啤酒企业:CACTER邮件网关成功替换IronPort!安全防护升级

客户案例 某大型啤酒厂商的公司规模和市场份额多年来始终都处于行业领先地位,积极赞助多项体育赛事,持续丰富和提升品牌形象。 作为一家具有全球影响力的企业,自然也成为了全球黑客等攻击团伙的重点目标,而系统攻击的开端便是钓…

互联网医院牌照的申请流程|互联网医院资质申请难吗

互联网医院系统现在已经发展的很成熟了,国家也出台了很多鼓励的相关政策,所以很多的医疗机构也纷纷的开始开发互联网医院系统,当然要想互联网医院系统能够正常的运行看诊,还需要申办互联网医院牌照,接下来给大家介绍一…

GE Hydran M2 监测各种故障气体的综合值

Hydran M2 是一种紧凑型永久安装在线变压器监测设备,可在出现故障情况时向人员发出警报。它持续监测各种故障气体的综合值(以 ppm 为单位)或仅监测氢气值(取决于购买的传感器)。此外,它还跟踪油中的水分&am…

Redis自学之路—基础数据结构(二)

目录 简介 Redis应用场景 Redis基础数据结构 一、string(字符串) string类型相关指令 二、list(列表) list类型相关指令 三、hash(字典) hash类型相关指令 四、set(集合) se…

Mysql多表和窗口函数

1.多表查询--自关联查询 # 格式: select * from A join A on 条件; 或者 select * from A left join A on 条件; # 自关联查询的用法和 内连接, 外连接等操作一模一样, 只不过是: 表自己关联自己. # 应用场景: 分类表(多级), 行政区域表(3级, 省市区). # 查询结果: 跟上述多…

一起来学shiny把(2)—-shiny页面布局

什么是shiny?Shiny是一个R包,可让您轻松地直接从 R 构建交互式 Web 应用程序(应用程序)。本系列是个长教程,带你由浅入深学习shiny。 上一节我们在文章《R语言系列教程—–一起来学shiny吧(1)》…

什么是语音识别的语音搜索?

前言 随着智能手机、智能音箱等智能设备的普及,语音搜索已经成为了一种趋势。语音搜索不仅方便快捷,而且可以实现双手的解放。语音搜索的实现离不开语音识别技术,本文将详细介绍语音识别的语音搜索。 语音识别的基本原理 语音识别是将语音信…

高光谱图像处理的spectral模块一些用法

目录 1、安装 2、读取高光谱图像 3、显示高光谱图像 4、spectral的特点 5、标签图显示 6、标签、地物融合显示 8、显示三维立方体 9、保存图像 1、安装 pip install spectral -i https://pypi.tuna.tsinghua.edu.cn/simple 2、读取高光谱图像 # -*- coding:utf-8 _*…

react笔记_14在react中使用echarts

目录 echarts官网在项目引入echarts[1]下载[2-1] 全量引入[2-2]按需引入问题 - 仅引入核心模块 图表配置[1] 柱状图(bar)横/纵向柱状图 [2] 漏斗图(funnel)漏斗图的形状 echarts官网 echarts官网 在项目引入echarts [1]下载 npm install echarts [2-1] 全量引入 import *…

FPGA_学习_05_管脚约束

前言:就初学管脚约束相关知识而言,内容还不足以构成饱满的文章。 但管脚约束是一个独立的内容,它是值得有一篇单独的博客的。若后续学习了管脚约束新的知识,则进一步扩充本篇博客内容。 1 XDC基础语法 Vivado的管脚约束文件用XDC…

易基因:m5C高甲基化介导EGFR突变的非小细胞肺癌耐药潜在机理|国人佳作

大家好,这里是专注表观组学十余年,领跑多组学科研服务的易基因。 对EGFR酪氨酸激酶抑制剂(EGFR-TKI)的固有耐药(Intrinsic resistance)和获得耐药(acquired resistance)是EGFR突变型非小细胞肺癌(NSCLC)患…

当上了小领导如何管理手下员工才能最高效的工作?

公司新建了一个项目,我负责招人并管理,之前没有正式的管理经验,如何才能更好的管理新人,快速推进工作? 在公司新建项目时,担任小领导的你需要负责招人和管理团队成员。作为一个没有正式管理经验的人&#x…

Elsevier Ocean Engineering Guide for Authors 解读

文章目录 ★Types of contributions★Submission checklistEthics in publishing★Declaration of competing interestDeclaration of generative AI in scientific writingSubmission declaration and verificationPreprint posting on SSRNUse of inclusive languageReportin…

vue-antd-admin加载动态菜单的步骤——vue3动态菜单——技能提升

最近在写后台管理系统时,发现老系统有个需求,就是动态加载菜单 以往的静态菜单:路由都放在router/config.js中,菜单页面放在pages里面。 加载的动态菜单:路由是通过接口获取,然后加载到路由中&#xff0c…

凌恩生物美文分享 | Nature教你如何深入开展植物基因组研究,看这篇绝对够!

自三代测序技术面世以来,基因组的相关研究迈上了一个新台阶,无论是完整性、连续性、准确性较二代测序技术组装基因组均有较大的提升。凌恩生物也紧随前沿,整合多种优势技术及信息分析平台,涵盖Illumina,Pacbio等多种测…