Get to know MDN better
此页面由社区从英文翻译而来。了解更多并加入 MDN Web Docs 社区。
flatMap() 方法对数组中的每个元素应用给定的回调函数,然后将结果展开一级,返回一个新数组。它等价于在调用 map() 方法后再调用深度为 1 的 flat() 方法(arr.map(...args).flat()),但比分别调用这两个方法稍微更高效一些。
一个在数组的每个元素上执行的函数。它应该返回一个包含新数组元素的数组,或是要添加到新数组中的单个非数组值。该函数将被传入以下参数:
element数组中正在处理的当前元素。
index数组中正在处理的当前元素的索引。
array调用 flatMap() 的当前数组。
thisArg 可选在执行 callbackFn 时用作 this 的值。参见迭代方法。
一个新的数组,其中每个元素都是回调函数的结果,并且被展开一级。
flatMap() 方法是一个迭代方法。有关回调函数的详细说明,请参见 Array.prototype.map()。flatMap() 方法等同于调用 map(callbackFn, thisArg) 后再调用 flat(1)——对于每个元素,它都会生成一个新元素数组,并将生成的数组连接起来形成一个新数组。
flatMap() 方法是通用的。它只需要 this 值具有 length 属性和整数键属性即可。但是,如果要展开从回调函数 callbackFn 返回的值,则该值必须是数组。
需要注意的是,在这种特定情况下,flatMap 方法的性能比 for 循环要慢——因为需要创建临时数组并进行垃圾回收,同时返回的数组不需要经常调整大小。但是,在注重灵活性和可读性的情况下,flatMap 仍可能是正确的解决方案。
虽然上面的示例可以通过使用 map() 方法自行实现,但下面的示例更好地展示了 flatMap() 方法的用法。
让我们从一组句子中生成单词列表。
请注意,输出列表长度可能与输入列表长度不同。
flatMap 方法可以用作在 map 方法中添加和删除元素(修改元素数量)的方法。换句话说,它允许你将一些项处理为另一些项(通过单独处理每个输入项),而不总是一对一的。在这个意义上,它的作用类似于 filter 的相反操作。如果要保留该项,则返回一个包含该项的单元素数组,如果要添加元素,则返回一个包含多个元素的数组,如果要删除该项,则返回一个空数组。
callbackFn 不会被源数组中的空槽调用,因为 map() 不会调用,而 flat() 将忽略返回数组中的空槽。
flatMap() 方法读取 this 的 length 属性,然后访问每个整数索引。如果回调函数的返回值不是数组,则始终直接将其附加到结果数组的末尾。
| ECMAScript® 2027 Language Specification # sec-array.prototype.flatmap |
启用 JavaScript 以查看此浏览器兼容性表。