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

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

相关推荐
热点推荐
篓子越捅越大!招体育生当医生、院长儿子吃空饷,不能再挖了

篓子越捅越大!招体育生当医生、院长儿子吃空饷,不能再挖了

小鋭有话说
2026-05-02 10:42:33
日本:射程之内!

日本:射程之内!

新民周刊
2026-05-01 09:17:00
首映轰下5580万票房,《寒战1994》夺冠,梁乐民把陈思诚打懵了

首映轰下5580万票房,《寒战1994》夺冠,梁乐民把陈思诚打懵了

电影票房预告片
2026-05-01 23:36:23
4月最后一夜爆雷潮!9龙头亏超百亿,53股巨亏,4大高危板块曝光

4月最后一夜爆雷潮!9龙头亏超百亿,53股巨亏,4大高危板块曝光

慧眼看世界哈哈
2026-05-01 05:59:44
突发!上海虹桥机场一客机撞上廊桥,东航致歉:落地后发生机械故障,旅客已安全下机

突发!上海虹桥机场一客机撞上廊桥,东航致歉:落地后发生机械故障,旅客已安全下机

新浪财经
2026-05-02 14:51:13
来了来了!2亿顶薪后卫啊!即将复出硬刚湖人

来了来了!2亿顶薪后卫啊!即将复出硬刚湖人

篮球实战宝典
2026-05-02 17:17:38
佛山彻底失守!广东第三城易主

佛山彻底失守!广东第三城易主

洞见报告
2026-05-02 18:55:22
正在直播!斯诺克世锦赛:吴宜泽vs马克-艾伦第三阶段,附实时比分

正在直播!斯诺克世锦赛:吴宜泽vs马克-艾伦第三阶段,附实时比分

金风说
2026-05-02 17:20:15
连球都没碰!孙继海3遍“太可怕了”,戳破中国足球30年的骗局

连球都没碰!孙继海3遍“太可怕了”,戳破中国足球30年的骗局

圣西罗的太阳
2026-05-02 13:37:34
里夫斯:詹姆斯所做的一切简直太疯狂;我没跟东契奇去欧洲治疗

里夫斯:詹姆斯所做的一切简直太疯狂;我没跟东契奇去欧洲治疗

懂球帝
2026-05-02 14:50:10
凌晨3点17突发预警!茅台引爆“5.2核弹”,代售会所一夜再造新富

凌晨3点17突发预警!茅台引爆“5.2核弹”,代售会所一夜再造新富

奇思妙想生活家
2026-05-02 17:25:42
耻辱2-4出局,季后赛第1伪强队,一副好牌打得稀烂,8换1交易完败

耻辱2-4出局,季后赛第1伪强队,一副好牌打得稀烂,8换1交易完败

毒舌NBA
2026-05-02 12:52:31
海南警方撒销案件 被无辜羁押821天女子有望重启国家赔偿

海南警方撒销案件 被无辜羁押821天女子有望重启国家赔偿

大象新闻
2026-05-02 13:42:01
五粮液在为谁擦屁股?

五粮液在为谁擦屁股?

不正确
2026-05-01 20:54:58
雷军估计更绝望了,北京车展181款首发新车,卖给谁呢?

雷军估计更绝望了,北京车展181款首发新车,卖给谁呢?

DearAuto
2026-05-01 11:56:57
5月2日俄乌最新:令人震惊的一次纵深打击

5月2日俄乌最新:令人震惊的一次纵深打击

西楼饮月
2026-05-02 14:25:35
退役3年 38岁前皇马巨星形象全毁:发福大肚腩 如同60岁

退役3年 38岁前皇马巨星形象全毁:发福大肚腩 如同60岁

叶青足球世界
2026-05-02 15:22:52
成都飞上海航班落地后撞击廊桥,资深机长:疑刹车失灵,机组用发动机反推控制飞机

成都飞上海航班落地后撞击廊桥,资深机长:疑刹车失灵,机组用发动机反推控制飞机

封面新闻
2026-05-02 16:52:02
上海一女子因丈夫是竞争公司总经理被开除,当事人:公司没有任何合法解除事由,法院:公司违法解除劳动合同,赔偿69万元

上海一女子因丈夫是竞争公司总经理被开除,当事人:公司没有任何合法解除事由,法院:公司违法解除劳动合同,赔偿69万元

都市快报橙柿互动
2026-05-02 17:36:58
五一假期莫氏鸡煲带火整条街,有摊贩一天营收五六千,还有佛系老板称虽没老莫挣的多但比他幸福

五一假期莫氏鸡煲带火整条街,有摊贩一天营收五六千,还有佛系老板称虽没老莫挣的多但比他幸福

极目新闻
2026-05-02 19:36:02
2026-05-02 20:27:00
Nodejs开发
Nodejs开发
分享只有程序员懂的干货
648文章数 823关注度
往期回顾 全部

科技要闻

AI热潮耗尽库存,Mac Mini起售调高200美元

头条要闻

美国制裁5家中企 商务部发禁令阻断

头条要闻

美国制裁5家中企 商务部发禁令阻断

体育要闻

休赛期总冠军,轮到休斯顿火箭

娱乐要闻

白百何罕晒大儿子 18岁元宝越来越帅

财经要闻

雷军很努力 小米还是跌破了30港元大关

汽车要闻

新纪录!零跑汽车4月交付达71387台

态度原创

手机
家居
本地
数码
公开课

手机要闻

Nothing Phone多款手机在印度涨价,最高涨幅5000卢比

家居要闻

灵动实用 生活艺术场

本地新闻

用青花瓷的方式,打开西溪湿地

数码要闻

威联通推出GPU-Ready边缘AI存储服务器QAI-h1290FX

公开课

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

无障碍浏览 进入关怀版