网易首页 > 网易号 > 正文 申请入驻

厉害了,一个更智能的 JavaScript 映射器:array.flatMap()

0
分享至

array.map() 是一个非常有用的映射函数:它接收一个数组和一个映射函数,然后返回一个新的映射数组。

然而,有一个替代 array.map()的方法:array.flatMap()(从ES2019开始可用)。这个方法给了我们映射的能力,但也可以在生成的映射数组中删除甚至添加新的项目。

1. 更加智能的映射器

有一个数字数组,我们要如何创建一个新的数组,使用每个数字加倍?

使用array.map()函数是一个好方法。

const numbers = [0, 3, 6];
const doubled = numbers.map(n => n * 2);
console.log(doubled); // logs [0, 6, 12]1.2.3.

地址:https://jsfiddle.net/dmitri_pavlutin/7g5fz93y/

numbers.map(number => 2 * number) 将 number 数组映射到一个新的数组,其中每个数字都被翻倍。

对于需要一对一映射的情况,也就是说,映射后的数组与原始数组的项数相同,array.map()的效果非常好。

但如果我们需要将一个数组的数字翻倍,同时跳为0的项,该怎么办?

直接使用 array.map() 是不可能的,因为该方法总是创建一个映射的数组,其项数与原数组相同。但是我们可以使用 array.map()和 array.filter() 的组合。

const numbers = [0, 3, 6];
const doubled = numbers
.filter(n => n !== 0)
.map(n => n * 2);
console.log(doubled); // logs [6, 12]1.2.3.4.5.

事例地址:https://jsfiddle.net/dmitri_pavlutin/cvtjyLpo/

array.map()和 array.filter() 可以解决问题,但有没有更简短的方法?

必须滴。使用 array.flatMap() 方法,只需调用一个方法就可以执行映射和删除项目。

const numbers = [0, 3, 6];
const doubled = numbers.flatMap(number => {
return number === 0 ? [] : [2 * number];
});
console.log(doubled); // logs [6, 12]1.2.3.4.5.

事例地址:https://jsfiddle.net/dmitri_pavlutin/j945qunz/

通过只使用 numbers.flatMap(),你可以将一个数组映射到另一个数组,但也可以从映射中跳过某些元素。

接着,我们来更详细地看看 array.flatMap()是如何工作的。

2. array.flatMap()

array.flatMap() 函数接受一个回调函数作为参数并返回一个新的映射数组

const mappedArray = array.flatMap((item, index, origArray) => {
// ...
return [value1, value2, ..., valueN];
}[, thisArg]);1.2.3.4.

回调函数在原数组中的每个iteam上被调用,有3个参数:当前项、索引和原数组。然后,回调函数返回的数组被扁平化了1层,得到的项目被添加到映射的数组中。

此外,该方法还接受第二个可选参数,表示回调内部的 this 值。

使用 array.flatmap()最简单的方法是将包含项目的数组扁平化

const arrays = [[2, 4], [6]];
const flatten = arrays.flatMap(item => item);
console.log(flatten); // logs [2, 4, 6]1.2.3.

事例地址:https://jsfiddle.net/dmitri_pavlutin/5rwvcz17/

但是array.flatMap()除了简单的扁平化之外,还可以做更多的事情。通过控制从回调中返回的数组项的数量:

  • 通过返回一个空数组从结果数组中删除该项
  • 通过返回一个带有一个新值的数组 [newValue] 来修改映射的项
  • 通过返回一个包含多个值的数组来添加新项: [newValue1, newValue2, ...]

例如,正如你在上一节中所看到的,可以通过将项目加倍来创建一个新的数组,但同时也要删除 0。

const numbers = [0, 3, 6];
const doubled = numbers.flatMap(number => {
return number === 0 ? [] : [2 * number];
});
console.log(doubled); // logs [6, 12]1.2.3.4.5.

现在,我们来看下它是怎么工作的。

如果当前项为 0,回调函数返回一个空数组 []。这意味着当被扁平化时,空数组[]没有提供任何值。

如果当前迭代项非零,则返回 [2 * number]。当扁平[2 * number]数组时,结果数组中只添加2 * number。

你也可以使用 array.flatMap()来增加映射的数组中的项目数量。

例如,下面的代码片段通过添加两倍和三倍的数字将一个数字数组映射到一个新数组:

const numbers = [1, 4];
const trippled = numbers.flatMap(number => {
return [number, 2 * number, 3 * number];
});
console.log(trippled);
// logs [1, 2, 3, 4, 8, 12]1.2.3.4.5.6.

事例地址:https://jsfiddle.net/dmitri_pavlutin/k7p2x1ar/

3: 总结

如果你想把一个数组映射到一个新的数组中,同时又能控制你想在新的映射数组中添加多少项,那么 array.flatMap() 方法就是一个好办法。

array.flatMap(callback) 的回调函数被调用,有3个参数:当前迭代的项、索引和原始数组。然后,从回调函数返回的数组在1层深处被扁平化,得到的项目被插入到所产生的映射数组中。

作者:Dmitri Pavlutin 译者:前端小智 来源:dmitripavlutin 原文:https://dmitripavltin.com/javascrit-array-flatmap/

责任编辑:姜华来源:大迁世界

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
250万吨!价格暴跌一半,泰越愁容满面:中国不再为高价榴莲买单

250万吨!价格暴跌一半,泰越愁容满面:中国不再为高价榴莲买单

番茄说史聊
2024-05-17 21:30:27
全世界最大的骗局其实是晨光文具,他根本不是靠卖文具赚钱

全世界最大的骗局其实是晨光文具,他根本不是靠卖文具赚钱

股票短线实盘指导操作
2024-05-19 08:42:14
小S蔡康永回归《康熙来了》, 詹仁雄喜曝花落中天

小S蔡康永回归《康熙来了》, 詹仁雄喜曝花落中天

郭茂辰海峡传真
2024-05-18 19:13:02
降薪续约1年!莫德里奇将终老伯纳乌,出任皇马队长,冲击第26冠

降薪续约1年!莫德里奇将终老伯纳乌,出任皇马队长,冲击第26冠

奥拜尔
2024-05-18 16:10:54
意外!艾克森刚在成都蓉城爆发,亚足联就给他官宣了一个好消息

意外!艾克森刚在成都蓉城爆发,亚足联就给他官宣了一个好消息

评球论事
2024-05-18 21:24:54
太炸裂了!有哪些事是死了也不能说的?细节真实生动,脸都笑红了

太炸裂了!有哪些事是死了也不能说的?细节真实生动,脸都笑红了

匹夫来搞笑
2024-05-18 15:06:24
朱丹带娃回娘家摘豆子,素颜像周一围,6岁女儿跟外婆干活很勤快

朱丹带娃回娘家摘豆子,素颜像周一围,6岁女儿跟外婆干活很勤快

娱乐的小灶
2024-05-18 20:03:49
统一又进一步,大陆宣布对台湾海峡管辖权之后,开始实际管控动作

统一又进一步,大陆宣布对台湾海峡管辖权之后,开始实际管控动作

博学大鹏说车呀
2024-05-19 05:06:52
1988年,智取威虎山剧组赴美演出,30多人滞留不归,声称弘扬国粹

1988年,智取威虎山剧组赴美演出,30多人滞留不归,声称弘扬国粹

高山非凡创作
2024-05-16 05:51:19
俄流亡寡头霍多尔科夫斯基预言:乌军或将在年底前丢掉哈尔科夫

俄流亡寡头霍多尔科夫斯基预言:乌军或将在年底前丢掉哈尔科夫

守望罗斯
2024-05-19 11:15:57
美警告赖清德,解放军520或登金马,央视专家:美军在金门有秘密

美警告赖清德,解放军520或登金马,央视专家:美军在金门有秘密

章鱼哥娱乐
2024-05-14 18:57:58
陕西省副省长窦敬丽兼任杨凌示范区管委会主任,接替钟洪江

陕西省副省长窦敬丽兼任杨凌示范区管委会主任,接替钟洪江

澎湃新闻
2024-05-19 11:02:26
为啥除了中国,全世界都不愿发展新能源?宁德老总一语道破天机

为啥除了中国,全世界都不愿发展新能源?宁德老总一语道破天机

奇点使者
2024-05-18 17:50:02
小中风是脑中风前兆,身体经常出现4个症状,别轻易忽视

小中风是脑中风前兆,身体经常出现4个症状,别轻易忽视

好心态
2024-05-16 22:46:20
射精一次会减寿?男性一生最多只能排6000次精?看完心里有数了

射精一次会减寿?男性一生最多只能排6000次精?看完心里有数了

荷兰豆爱健康
2024-05-13 15:13:38
天上人间第一花魁惨死家中,双乳被割,通灵人揭露真相:她死得不冤

天上人间第一花魁惨死家中,双乳被割,通灵人揭露真相:她死得不冤

古今档案
2024-05-17 14:39:21
亲兄妹之间应该避嫌吗?网友:睁眼就看到下面正在被咬,有点疼!

亲兄妹之间应该避嫌吗?网友:睁眼就看到下面正在被咬,有点疼!

户外阿崭
2024-05-19 07:02:35
珠圆玉润,海边性感美照

珠圆玉润,海边性感美照

娱乐八卦木木子
2024-05-18 20:13:18
乒乓3消息:巴特拉再评王曼昱,刘国梁出手,奥运防好印度日本队

乒乓3消息:巴特拉再评王曼昱,刘国梁出手,奥运防好印度日本队

阿信点评
2024-05-18 17:41:44
中方兵力连夜驰援黄岩岛,卫星拍下震撼一幕,天罗地网已经布下

中方兵力连夜驰援黄岩岛,卫星拍下震撼一幕,天罗地网已经布下

懂体育的小吖头
2024-05-17 14:12:45
2024-05-19 12:04:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 824关注度
往期回顾 全部

科技要闻

雷军直播开车2000万人围观!突然遭别车

头条要闻

媒体:台立法机构"武斗"多人挂彩 韩国瑜神态明显疲惫

头条要闻

媒体:台立法机构"武斗"多人挂彩 韩国瑜神态明显疲惫

体育要闻

天赋最差的人,成为NBA最强替补控卫

娱乐要闻

《庆余年2》首播口碑出炉!有好有坏

财经要闻

史诗级利好,房地产这次有救了吗?

汽车要闻

智驾升级/月底上市 问界新M7 MAX焕新版

态度原创

时尚
旅游
亲子
家居
本地

被这个短发女神折服了!只穿“基础款”也这么美,夏天可照抄

旅游要闻

《庆余年2》取景地 丽水“庆”你来玩

亲子要闻

陪孩子参加野营活动

家居要闻

遇见交响 音乐流动在设计之中

本地新闻

博物馆的正确打开方式|来河南,沉浸式体验中原文明

无障碍浏览 进入关怀版