ZetCode

JavaScript flatMap 方法

最后修改于 2025 年 4 月 4 日

在本文中,我们将展示如何使用 JavaScript 中的 flatMap 方法来映射和展平数组。

数组 flatMap 操作

flatMap 方法是 mapflat 操作的组合。它首先使用映射函数映射每个元素,然后将结果展平成一个新的数组。这与先映射后进行深度为 1 的展平操作相同。

flatMap 的主要优势在于它在一个方法调用中执行这两个操作,使代码更简洁。当处理包含嵌套数组的数组,或者需要同时转换和展平数据时,它特别有用。

flatMap 方法不会修改原始数组。相反,它会返回一个包含已映射和展平结果的新数组。回调函数可以返回单个值或值数组。

基本 flatMap 示例

以下示例演示了 flatMap 方法的基本用法。

main.js
const numbers = [1, 2, 3];
const doubledAndFlattened = numbers.flatMap(num => [num * 2]);

console.log(numbers);  // Original array unchanged
console.log(doubledAndFlattened);  // New mapped and flattened array

我们创建一个数组,并使用 flatMap 将每个元素加倍。回调函数在数组中返回每个加倍后的数字,然后 flatMap 将其展平。原始数组保持不变。

$ node main.js
[ 1, 2, 3 ]
[ 2, 4, 6 ]

展平嵌套数组

flatMap 可以用于在转换数组的同时展平它们。

main.js
const phrases = ["hello world", "good morning"];
const words = phrases.flatMap(phrase => phrase.split(' '));

console.log(words);

我们将每个短语拆分成单词,这将创建单词数组。然后 flatMap 将这些数组展平成一个单词数组。这演示了 flatMap 如何一步处理和展平数据。

$ node main.js
[ 'hello', 'world', 'good', 'morning' ]

使用 flatMap 过滤和映射

通过为要排除的元素返回空数组,flatMap 可用于过滤和映射元素。

main.js
const numbers = [1, 2, 3, 4, 5];
const evenSquares = numbers.flatMap(num => 
    num % 2 === 0 ? [num * num] : []
);

console.log(evenSquares);

我们过滤掉奇数并对偶数进行平方。通过为奇数返回空数组,它们将从结果中排除。这显示了 flatMap 如何结合过滤和映射操作。

$ node main.js
[ 4, 16 ]

处理嵌套数组

flatMap 尤其适用于处理数组的数组。

main.js
const books = [
    { title: "Book 1", tags: ["fantasy", "adventure"] },
    { title: "Book 2", tags: ["science", "fiction"] }
];
const allTags = books.flatMap(book => book.tags);

console.log(allTags);

我们从一个书对象数组中提取所有标签。每本书的标签都在一个数组中,flatMap 将它们组合成一个单一的数组。这比使用 map 后跟 flat 更简洁。

$ node main.js
[ 'fantasy', 'adventure', 'science', 'fiction' ]

使用 flatMap 扩展元素

flatMap 可用于将每个元素扩展为多个元素。

main.js
const numbers = [1, 2, 3];
const expanded = numbers.flatMap(num => [num - 1, num, num + 1]);

console.log(expanded);

我们创建一个新数组,其中包含每个原始数字及其前驱和后继。回调函数为每个输入返回一个包含三个值的数组,flatMap 将其展平成最终结果。

$ node main.js
[ 0, 1, 2, 1, 2, 3, 2, 3, 4 ]

来源

数组 flatMap - 语言参考

在本文中,我们演示了如何使用 flatMap() 方法来转换和展平 JavaScript 中的数组。

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。自 2007 年以来,我一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我拥有超过十年的编程教学经验。

列出 所有 JS 数组函数。