Iterator.prototype.flatMap()

基準線 2025
新推出

自 ⁨2025 年 3 月⁩ 起,此功能可在最新的裝置和瀏覽器版本上使用。此功能可能在舊裝置或瀏覽器上無法正常工作。

flatMap() 方法用於 Iterator 例項,它會返回一個新的 迭代器輔助物件,該物件會遍歷原始迭代器中的每個元素,執行一個對映函式,並生成對映函式返回的元素(這些元素包含在另一個迭代器或可迭代物件中)。

語法

js
flatMap(callbackFn)

引數

callbackFn

一個要為迭代器生成的每個元素執行的函式。它應該返回一個生成 flatMap() 要生成的元素的迭代器或可迭代物件。請注意,與 Array.prototype.flatMap() 不同,你不能返回單個非迭代器/可迭代值。該函式使用以下引數進行呼叫

element

陣列中正在處理的當前元素。

index

陣列中正在處理的當前元素的索引。

返回值

一個新的 迭代器輔助物件。當迭代器輔助物件的 next() 方法被首次呼叫時,它會對底層迭代器生成的第一個元素呼叫 callbackFn,然後返回的值(它應該是一個迭代器或可迭代物件)會由迭代器輔助物件逐個生成(類似於 yield*)。當 callbackFn 返回的元素生成完畢後,會從底層迭代器獲取下一個元素。當底層迭代器完成時,迭代器輔助物件也會完成(next() 方法會生成 { value: undefined, done: true })。

異常

TypeError

如果 callbackFn 返回一個非迭代器/可迭代值或字串原始型別,則會丟擲此錯誤。

描述

flatMap 接受 callbackFn 的兩種返回型別:迭代器或可迭代物件。它們的處理方式與 Iterator.from() 相同:如果返回值是可迭代的,則呼叫 [Symbol.iterator]() 方法並使用其返回值;否則,將返回值視為迭代器並呼叫其 next() 方法。

js
[1, 2, 3]
  .values()
  .flatMap((x) => {
    let itDone = false;
    const it = {
      next() {
        if (itDone) {
          return { value: undefined, done: true };
        }
        itDone = true;
        return { value: x, done: false };
      },
    };
    switch (x) {
      case 1:
        // An iterable that's not an iterator
        return { [Symbol.iterator]: () => it };
      case 2:
        // An iterator that's not an iterable
        return it;
      case 3:
        // An iterable iterator is treated as an iterable
        return {
          ...it,
          [Symbol.iterator]() {
            console.log("Symbol.iterator called");
            return it;
          },
        };
      default:
        return undefined;
    }
  })
  .toArray();
// Logs "Symbol.iterator called"
// Returns [1, 2, 3]

示例

合併 Map

以下示例將兩個 Map 物件合併為一個

js
const map1 = new Map([
  ["a", 1],
  ["b", 2],
  ["c", 3],
]);
const map2 = new Map([
  ["d", 4],
  ["e", 5],
  ["f", 6],
]);

const merged = new Map([map1, map2].values().flatMap((x) => x));
console.log(merged.get("a")); // 1
console.log(merged.get("e")); // 5

這可以避免建立 Map 內容的任何臨時副本。請注意,陣列 [map1, map2] 必須首先轉換為迭代器(使用 Array.prototype.values()),因為 Array.prototype.flatMap() 僅展開陣列,而不展開可迭代物件。

js
new Map([map1, map2].flatMap((x) => x)); // Map(1) {undefined => undefined}

返回字串

字串是可迭代的,但 flatMap() 會專門拒絕 callbackFn 返回的字串原始型別,這是因為按碼點進行迭代的行為通常不是你想要的。

js
[1, 2, 3]
  .values()
  .flatMap((x) => String(x))
  .toArray(); // TypeError: Iterator.prototype.flatMap called on non-object

你可能希望將其包裝在陣列中,以便整個字串作為一個整體生成

js
[1, 2, 3]
  .values()
  .flatMap((x) => [String(x)])
  .toArray(); // ['1', '2', '3']

或者,如果你想要按碼點迭代的行為,可以使用 Iterator.from() 將其轉換為一個正確的迭代器

js
[1, 2, 3]
  .values()
  .flatMap((x) => Iterator.from(String(x * 10)))
  .toArray();
// ['1', '0', '2', '0', '3', '0']

規範

規範
ECMAScript® 2026 語言規範
# sec-iterator.prototype.flatmap

瀏覽器相容性

另見