当前位置: 首页 > news >正文

ES6中flat与flatMap使用

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 });

相关文章:

ES6中flat与flatMap使用

1、方法介绍 数组的成员有时还是数组,Array.prototype.flat()用于将嵌套的数组“拉平”,变成一维的数组。该方法返回一个新数组,对原数据没有影响。 [1, 2, [3, 4]].flat() // [1, 2, 3, 4]上面代码中,原数组的成员里面有一个数…...

苹果手机、电脑如何进行屏幕录制?苹果录屏功能在哪?

随着人们生活水平的提高,不少小伙伴都会选择苹果手机、苹果电脑作为主要的设备。因为使用苹果电脑进行办公,不仅仅能够提升效率,对于文件的安全性也是有一些保障的。那么,在使用苹果电脑的时候,如果需要有录屏的需求该…...

什么是研发 Lead Time?我悟了!

嗨,朋友!你听说过「新型工伤」吗? 我好像「赛博确诊」了😣 那天朋友约我吃饭,我下意识回复了句「好的,那我提一个日程」……还有上次跟一位准妈妈聊天,我好奇宝宝的预产期,结果脱口…...

android 窗口焦点介绍

背景 我们经常会遇到一种Application does not hava focused window的ANR异常,这种异常一般是没有焦点窗口FocusedWindow导致,且这类异常只会发生在key事件的派发,因为key事件是需要找到一个焦点窗口然后再派发,而触摸事件只需要找到当前显示…...

研发工程师玩转Kubernetes——构建、推送自定义镜像

这几节我们都是使用microk8s学习kubernetes,于是镜像库我们也是使用它的插件——registry。 开启镜像库插件 microk8s enable registry模拟开发环境 我们使用Python作为开发语言来进行本系列的演练。 安装Python sudo apt install python3.11安装Pip3 pip3用于…...

[网络安全]DVWA之XSS(Stored)攻击姿势及解题详析合集

[网络安全]DVWA之XSS(Stored)攻击姿势及解题详析合集 XSS(Stored)-low level源代码姿势基于Message板块基于Name板块 XSS(Stored)-medium level源代码姿势双写绕过大小写绕过Xss标签绕过 XSS(Stored)-high level源代码姿势:Xss标签绕过 XSS(S…...

VP记录:Codeforces Round 873 (Div. 2) A~D1

传送门:CF 前题提要:因为本场比赛的D题让我十分难受.刚开始以为 r − l 1 r-l1 r−l1与 r − l r-l r−l应该没什么不同.但是做的时候发现假设是 r − l 1 r-l1 r−l1的话我们可以使用线段树来维护,但是 r − l r-l r−l就让线段树维护的难度大大增加,这导致我十分烦躁,所以…...

【C++】函数提高

欢迎来到博主 Apeiron 的博客,祝您旅程愉快 !时止则止,时行则行。动静不失其时,其道光明。 目录 1、缘起 2、函数默认参数 3、函数占位参数 4、总结 1、缘起 以前学习过了函数的基本用法和功能,现在是时候学习函数…...

【可持续能源:让我们迈向绿色、可持续未来的道路】

作为未来的主要能源来源,可持续能源技术确实有潜力改变我们的世界。随着全球对传统化石燃料的依赖程度逐渐降低,可再生能源已成为许多国家推进能源转型的首选。 从太阳能和风能到地热能和潮汐能,可持续能源技术已经在许多方面取得了重大突破…...

ES6中数组新增了哪些扩展?

一、扩展运算符的应用 ES6通过扩展元素符...&#xff0c;好比 rest 参数的逆运算&#xff0c;将一个数组转为用逗号分隔的参数序列 console.log(...[1, 2, 3]) // 1 2 3console.log(1, ...[2, 3, 4], 5) // 1 2 3 4 5[...document.querySelectorAll(div)] // [<div>, …...

【算法】动态规划

一、基础知识 动态规划的基本思想&#xff1a;将待求解问题分解成若干个子问题&#xff0c;如果各个子问题不是独立的&#xff0c;不同的子问题的个数只是多项式量级&#xff0c;为避免大量的重复计算&#xff0c;用一个表记录所有已解决的子问题的答案&#xff0c;而在需要的…...

HNOI2014 世界树

洛谷P3233 [HNOI2014]世界树 题目大意 有一棵 n n n个点的树&#xff0c;每个点有一个编号&#xff0c;有 q q q次操作。对于每次操作&#xff0c;给出 m m m个点并称为议事点&#xff0c;树上各个点由离这个点最近的议事点管理&#xff08;如果有多个议事点离这个点最近&…...

在MyBatis XML文件中处理特殊符号的方法,如“>”、“<”、“>=”、“<=”这些符号XML会报错如何处理

前言 在MyBatis的XML映射文件中&#xff0c;我们经常需要使用特殊符号&#xff0c;比如"大于"、"小于"、"大于等于"、"小于等于"等比较操作符。然而&#xff0c;这些符号在XML中具有特殊的含义&#xff0c;因此需要进行特殊处理&…...

第三章--第一篇:什么是对话系统?

对话系统是一种人机交互的技术,旨在使计算机能够与人类进行自然而流畅的对话。它是人工智能领域的重要研究方向,具有重要的实际应用价值和广泛的普适性。 首先,对话系统的重要性在于它可以提供高效便捷的人机交互方式。传统的人机界面,如图形用户界面(GUI)和命令行界面(…...

项目基础搭建

一、项目创建 1.下载并安装nodejs 下载完成后&#xff0c;查看node版本 winR 快捷键&#xff0c;cmd确定&#xff0c;进入后台黑框 node -v查看npm安装路径 npm root -g安装cnpm镜像 npm install -g cnpm --registryhttps://registry.npm.taobao.org&#xff1a;查看npm版…...

PFCdocumentation_FISH Rules and Usage

目录 FISH Scripting FISH Rules and Usage Lines Data Types Reserved Names for Functions and Variables Scope of Variables Functions: Structure, Evaluation, and Calling Scheme Arithmetic: Expressions and Type Conversions Redefining FISH Functions Ex…...

如何完美卸载VS2015(2023年5月份实测有效)

使用控制面板卸载VS2015&#xff0c;出现正在配置您的系统&#xff0c;这可能需要一些时间&#xff0c;然后就出现卡住半个小时第二行的条都没有动的问题&#xff0c;这里提供vs2015以及以前版本的卸载方式 问题产生原因:他需要下载一些东西&#xff0c;然后由于你懂的网络原因…...

JavaScript如何声明和定义函数

JavaScript是一门非常有趣的编程语言&#xff0c;它可以让我们创建各种各样的函数来解决各种各样的问题。在JavaScript中&#xff0c;函数的声明和定义非常重要&#xff0c;因为它们决定了函数的行为和执行过程。 首先&#xff0c;让我们来看看JavaScript中函数的声明。在Java…...

微信小程序 WebSocket 通信 —— 在线聊天

在Node栏目就讲到了Socket通信的内容&#xff0c;使用Node实现Socke通信&#xff0c;还使用两个流行的WebSocket 库&#xff0c;ws 和 socket.io&#xff0c;在小程序中的WebSocket接口和HTML5的WebSocket基本相同&#xff0c;可以实现浏览器与服务器之间的全双工通信。那么本篇…...

VMware快照:简化虚拟化环境管理与数据保护

引言&#xff1a; 在虚拟化环境中&#xff0c;数据保护和灵活性是至关重要的。VMware快照作为一项强大的功能&#xff0c;为虚拟机管理者提供了便利和安全性。本文将介绍VMware快照的使用&#xff0c;以及它为用户带来的几个关键优势。 VMware快照是一项重要的功能&#xff0c…...

51c自动驾驶~合集58

我自己的原文哦~ https://blog.51cto.com/whaosoft/13967107 #CCA-Attention 全局池化局部保留&#xff0c;CCA-Attention为LLM长文本建模带来突破性进展 琶洲实验室、华南理工大学联合推出关键上下文感知注意力机制&#xff08;CCA-Attention&#xff09;&#xff0c;…...

Spark 之 入门讲解详细版(1)

1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室&#xff08;Algorithms, Machines, and People Lab&#xff09;开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目&#xff0c;8个月后成为Apache顶级项目&#xff0c;速度之快足见过人之处&…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

条件运算符

C中的三目运算符&#xff08;也称条件运算符&#xff0c;英文&#xff1a;ternary operator&#xff09;是一种简洁的条件选择语句&#xff0c;语法如下&#xff1a; 条件表达式 ? 表达式1 : 表达式2• 如果“条件表达式”为true&#xff0c;则整个表达式的结果为“表达式1”…...

全球首个30米分辨率湿地数据集(2000—2022)

数据简介 今天我们分享的数据是全球30米分辨率湿地数据集&#xff0c;包含8种湿地亚类&#xff0c;该数据以0.5X0.5的瓦片存储&#xff0c;我们整理了所有属于中国的瓦片名称与其对应省份&#xff0c;方便大家研究使用。 该数据集作为全球首个30米分辨率、覆盖2000–2022年时间…...

(二)原型模式

原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...

HBuilderX安装(uni-app和小程序开发)

下载HBuilderX 访问官方网站&#xff1a;https://www.dcloud.io/hbuilderx.html 根据您的操作系统选择合适版本&#xff1a; Windows版&#xff08;推荐下载标准版&#xff09; Windows系统安装步骤 运行安装程序&#xff1a; 双击下载的.exe安装文件 如果出现安全提示&…...

Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!

一、引言 在数据驱动的背景下&#xff0c;知识图谱凭借其高效的信息组织能力&#xff0c;正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合&#xff0c;探讨知识图谱开发的实现细节&#xff0c;帮助读者掌握该技术栈在实际项目中的落地方法。 …...

今日科技热点速览

&#x1f525; 今日科技热点速览 &#x1f3ae; 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售&#xff0c;主打更强图形性能与沉浸式体验&#xff0c;支持多模态交互&#xff0c;受到全球玩家热捧 。 &#x1f916; 人工智能持续突破 DeepSeek-R1&…...

高防服务器能够抵御哪些网络攻击呢?

高防服务器作为一种有着高度防御能力的服务器&#xff0c;可以帮助网站应对分布式拒绝服务攻击&#xff0c;有效识别和清理一些恶意的网络流量&#xff0c;为用户提供安全且稳定的网络环境&#xff0c;那么&#xff0c;高防服务器一般都可以抵御哪些网络攻击呢&#xff1f;下面…...