JavaScript Guidebook

JavaScript 完全知识体系

Array.prototype.flatMap()

⭐️ ES2019(ES10)新特性

Array.prototype.flatMap() 方法首先使用映射函数映射每个元素,然后将结果压缩成一个新数组。它与 Array.prototype.map() 连着深度值为 1 的 Array.prototype.flat() 几乎相同,但该方法通常在合并成一种方法的效率稍微高一些。

语法

语法:

arr.flatMap(callback, [thisArg]);

类型声明:

type FlatArray<Arr, Depth extends number> = {
done: Arr;
recur: Arr extends ReadonlyArray<infer InnerArr>
? FlatArray<
InnerArr,
[-1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20][Depth]
>
: Arr;
}[Depth extends -1 ? 'done' : 'recur'];
interface ReadonlyArray<T> {
flatMap<U, This = undefined>(
callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,
thisArg?: This
): U[];
}
interface Array<T> {
flatMap<U, This = undefined>(
callback: (this: This, value: T, index: number, array: T[]) => U | ReadonlyArray<U>,
thisArg?: This
): U[];
}

参数说明:

参数说明类型
callback可以生成一个新数组中的元素的函数Function
thisArg(可选参数)执行 callback 函数时,使用的 this

callback 函数的参数:

  • currentValue:当前数组中处理的元素
  • index:(可选的)数组中正处理的当前元素的索引
  • array:(可选的)被调用的数组

代码示例

基本用法

const arr1 = [1, 2, 3, 4];
arr1.map((x) => [x * 2]);
// [[2], [4], [6], [8]];
arr1.flatMap((x) => [x * 2]);
// [2, 4, 6, 8]
// 只会扁平化一层
arr1.flatMap((x) => [[x * 2]]);
// [[2], [4], [6], [8]]

参考资料