JavaScript 映射器 array.flatMap()

 更新时间:2022年02月16日 14:16:57   作者:前端小智  
这篇文章主要介绍了JavaScript 映射器 array.flatMap(),array.flatMap()是一个映射函数,它接收一个数组和一个映射函数,然后返回一个新的映射数组,下面进入文章了解具体内容

前言:

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]

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]

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]

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

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

2. array.flatMap()

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

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

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

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

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

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

但是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]

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

如果当前项为 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]

3. 总结

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

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

到此这篇关于JavaScript 映射器array.flatMap()的文章就介绍到这了,更多相关JavaScript 映射器内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 老生常谈js中的MVC

    老生常谈js中的MVC

    下面小编就为大家带来一篇老生常谈js中的MVC。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-07-07
  • 微信小程序实现侧边栏分类

    微信小程序实现侧边栏分类

    这篇文章主要为大家详细介绍了微信小程序实现侧边栏分类,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • 前端JS经典问题之跨域的解决方案

    前端JS经典问题之跨域的解决方案

    这篇文章主要介绍了前端JS经典问题之跨域的解决方案,文中主要讲了浏览器的同源策略、跨域限制以及解决跨域的几种方法,包括CORS、JSONP和配置代理等,需要的朋友可以参考下
    2024-11-11
  • 使用JS实现在空白页上展示出一个有趣的时钟

    使用JS实现在空白页上展示出一个有趣的时钟

    在我们日常的网页浏览中,空白的页面往往会被视为一种无趣的事物,一片等待填充的空间,今天我们来学习一下如何使用JS在空白的网页上展示出一个有趣的时钟吧,感兴趣的小伙伴跟着小编一起来看看吧
    2024-04-04
  • JS控制静态页面传递参数并获取参数应用

    JS控制静态页面传递参数并获取参数应用

    这篇文章主要介绍了JS控制静态页面传递参数并获取参数应用的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-08-08
  • js实现的仿新浪微博完美的时间组件升级版

    js实现的仿新浪微博完美的时间组件升级版

    本博客没有华丽的布局,只求朴实的js的代码,只为js代码爱好者提供,一周大概会出1-2篇js前沿代码的文章.只是代码,不说技术
    2011-12-12
  • JS+CSS实现表格高亮的方法

    JS+CSS实现表格高亮的方法

    这篇文章主要介绍了JS+CSS实现表格高亮的方法,可实现鼠标滑过表格高亮效果,具有一定参考借鉴价值,需要的朋友可以参考下
    2015-08-08
  • 在网页中使用document.write时遭遇的奇怪问题

    在网页中使用document.write时遭遇的奇怪问题

    很多时候我们都会在网页上的JavaScript中使用document.write来写入一些东西,有的时候可能因为我们无法改变某一部分HTML而不得不使用这样的办法,也有的时候是因为在进行跨应用的脚本调用。
    2010-08-08
  • 微信小程序实现表单验证提交功能

    微信小程序实现表单验证提交功能

    这篇文章主要为大家详细介绍了微信小程序实现表单验证提交功能,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-07-07
  • js 巧妙去除数组中的重复项

    js 巧妙去除数组中的重复项

    最近, 我在看YAHOO.util.YUILoader类的源码, 其中有个排除数组重复项的方法, 让我觉得甚为巧妙, 这里分享下…
    2010-01-01

最新评论