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

厉害了,一个更智能的 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.

相关推荐
热点推荐
闫学晶看了要气炸!网友:用3个歪果裂枣,秒了99.6%少年英才

闫学晶看了要气炸!网友:用3个歪果裂枣,秒了99.6%少年英才

探长影视解说
2026-01-17 10:51:07
1983年,黄永胜弥留之际苦求一事,中央特批:满足他

1983年,黄永胜弥留之际苦求一事,中央特批:满足他

寄史言志
2026-01-14 16:36:19
税率从100%降至6.1%,加拿大总理宣布进口4.9万辆中国电动汽车

税率从100%降至6.1%,加拿大总理宣布进口4.9万辆中国电动汽车

界面新闻
2026-01-16 23:02:38
实践三十二号卫星发射失利

实践三十二号卫星发射失利

界面新闻
2026-01-17 10:24:41
福建小伙在柬埔寨街头流浪,被打致身上多处伤口,当地华人救助后开直播帮忙找到家人

福建小伙在柬埔寨街头流浪,被打致身上多处伤口,当地华人救助后开直播帮忙找到家人

潇湘晨报
2026-01-16 19:52:12
百万平供应冲击下,深圳写字楼空置率已超三成,豪宅成全年楼市“稳定器”

百万平供应冲击下,深圳写字楼空置率已超三成,豪宅成全年楼市“稳定器”

华夏时报
2026-01-16 22:52:00
她是叶帅最后一任妻子,生下一双儿女,现年96岁,孙女是知名歌星

她是叶帅最后一任妻子,生下一双儿女,现年96岁,孙女是知名歌星

历史龙元阁
2026-01-10 08:55:08
林肯号前往波斯湾,为何打仗,美国一定要有双航母?

林肯号前往波斯湾,为何打仗,美国一定要有双航母?

高博新视野
2026-01-15 20:58:45
3-1逆转夺三连胜!中国女乒20岁新星崛起:孙颖莎师妹又进化

3-1逆转夺三连胜!中国女乒20岁新星崛起:孙颖莎师妹又进化

李喜林篮球绝杀
2026-01-16 11:32:53
1972年尼克松问该怎么称呼蒋介石?毛主席淡定回了7个字,全场瞬间笑翻

1972年尼克松问该怎么称呼蒋介石?毛主席淡定回了7个字,全场瞬间笑翻

源溯历史
2026-01-01 23:46:13
伊朗神权崩塌前夜:9000万高知青年与内战危机

伊朗神权崩塌前夜:9000万高知青年与内战危机

夏至陌离殇
2026-01-14 15:34:27
中加签署2000亿人民币协议,加拿大最终妥协,给了中国最惠国待遇

中加签署2000亿人民币协议,加拿大最终妥协,给了中国最惠国待遇

吃货的分享
2026-01-17 11:20:39
高市早苗对华正式“宣战”!马克龙转头背叛日本,特朗普告示全球

高市早苗对华正式“宣战”!马克龙转头背叛日本,特朗普告示全球

boss外传
2026-01-16 12:00:07
特朗普对华改口了!他对记者表示:中国可以向美国商品开放市场

特朗普对华改口了!他对记者表示:中国可以向美国商品开放市场

扶苏聊历史
2026-01-16 15:26:28
上海未解之谜:虹桥和浦东机场为何差别这么大?

上海未解之谜:虹桥和浦东机场为何差别这么大?

今日搞笑分享
2026-01-16 07:41:28
38岁TVB女星与男友分手后不急找结婚对象,醉心打球获顶流在旁欣赏

38岁TVB女星与男友分手后不急找结婚对象,醉心打球获顶流在旁欣赏

TVB剧评社
2026-01-17 10:12:48
1943年八路军中弹倒地,汉奸看他没死悄声说:别动,我们一会就撤

1943年八路军中弹倒地,汉奸看他没死悄声说:别动,我们一会就撤

云霄纪史观
2026-01-16 16:25:01
81岁曹翠芬现状:在北京住150平三居室,结婚60年无儿无女成遗憾

81岁曹翠芬现状:在北京住150平三居室,结婚60年无儿无女成遗憾

阿讯说天下
2026-01-16 15:56:15
美交通部长插嘴:涉华决定,加拿大要后悔

美交通部长插嘴:涉华决定,加拿大要后悔

观察者网
2026-01-17 10:00:59
老外集体“变中国人”?学喝热水穿拖鞋,网友:第一次当中国人,怪紧张的...

老外集体“变中国人”?学喝热水穿拖鞋,网友:第一次当中国人,怪紧张的...

英国那些事儿
2026-01-15 23:32:23
2026-01-17 12:40:49
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

8亿周活扛不住烧钱 ChatGPT终向广告"低头"

头条要闻

癌症晚期男子驾车撞死婆孙2人后病亡 法院判赔超200万

头条要闻

癌症晚期男子驾车撞死婆孙2人后病亡 法院判赔超200万

体育要闻

三巨头走了俩,联盟笑柄却起飞了

娱乐要闻

徐家还是爱孩子的,在马筱梅生产前选择和解

财经要闻

央行再次结构性降息0.25个百分点

汽车要闻

林肯贾鸣镝:稳中求进,将精细化运营进行到底

态度原创

旅游
亲子
艺术
时尚
公开课

旅游要闻

郑州冬日顶流!这里的水杉林红成童话(8条公交线路直达)!

亲子要闻

五乱毁一生,宝妈分享:教会孩子原则和底线

艺术要闻

12个字竟引发书法教育大讨论,你怎么看?

今年冬天最时髦保暖的4组搭配,照着穿美出新高度!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版