首頁 > web前端 > js教程 > Fluent Streams:用於豐富可迭代操作的函式庫

Fluent Streams:用於豐富可迭代操作的函式庫

Susan Sarandon
發布: 2024-12-15 16:24:16
原創
208 人瀏覽過

Fluent Streams: A Library for Rich Iterables Manipulation

作品:https://code-art.pictures/

想像圖書館:

  • 像 Ramda 一樣,提供了許多有用的可迭代操作函數
  • 讀起來很熟悉,就像標準陣列迭代方法一樣
  • 不會嘗試取代 JavaScript 內建函數,例如 Array、Set 或迭代協議
  • 像 Java Streams 一樣,包括Optional以明確區分「無值」和「未定義為值」
  • 捆綁包尺寸小巧

我找不到一個能夠滿足所有這些需求的函式庫,所以我建立了我的小函式庫 - Fluent-streams。

談話很便宜。顯示程式碼

文中最常見的 3 個單字

const words = ['Lorem', 'ipsum', /* ... */]
stream(words)
  .groupBy(word => word.toLowerCase())
  .map(([word, list]) => [word, list.length])
  .sortBy(([, length])  => -length)
  .take(3)
  .toArray()

// => ['ut', 3], ['in', 3], ['dolor', 2]
登入後複製

互質整數

// Endless stream of 2..999 integers
const randomInts = continually(() => 
  2 + Math.floor(Math.random() * 998)
)

randomInts
  .zip(randomInts)
  .filter(([a, b]) => gcd(a, b) === 1)
  .distinctBy(pair => stream(pair).sortBy(i => i).join())
  .take(10)

// => [804, 835], [589, 642], [96, 145], ...
登入後複製
  • 流可以是無限的,如圖所示,但您可以使用 take(n) 方法將它們限制為前 n 個項目
  • 流可以多次重複使用,甚至可以並行重複使用。這是因為流是無狀態的並且僅儲存對輸入的引用。僅當流產生迭代器時才會建立狀態。

生成一副牌

const deck = streamOf('♠', '♥', '♣', '♦')
  .flatMap(suit =>
    streamOf<string | number>(
      'A',
      ...range(2, 11),
      'J',
      'Q',
      'K'
    ).map(rank => `${rank}${suit}`)
  )

// => 'A♠', '2♠', '3♠', ...
登入後複製

並玩德州撲克!

  const playersNum = 2
  const [flop, turn, river, ...hands] = deck
    .takeRandom(3 + 1 + 1 + playersNum * 2)
    .zipWithIndex()
    .splitWhen((_, [, j]) =>
      j === 3            // flop
      || j === 4         // turn
      || j >= 5          // river
         && j % 2 === 1  // ...players' hands
    )
    .map(chunk =>
      // Unzip index
      chunk.map(([card]) => card)
    )

// flop = ['3♦', '9♣', 'J♦']
// turn = ['4♣']
// river = ['7♦']
// hands = ['J♠', '4♥'], ['10♠', '8♥']
登入後複製

第一個玩家在翻牌圈有一對 J,而第二個玩家在河牌圈得到順子。誰會獲勝?

這一定很便宜

以上所有內容都可以只使用本機資料結構來實現。然而,使用 Fluent Streams 編寫的程式碼讀起來更好。雖然使程式碼更具可讀性是一個完全有效的目標,但在認知負載、套件大小和效能方面實現它的成本應該很低。

Fluent Streams 正是如此!原因如下:

  • 沒有學習曲線:API 感覺很熟悉,類似標準陣列方法。添加很容易,刪除也很容易。
  • 沒有重新發明:該程式庫不會建立新的資料結構或協定 - 它是建構在 JavaScript 已經強大的功能之上。
  • 最小的捆綁影響:壓縮後大小僅 8.5 kB,非常輕量。如果您的專案已經包含 React 及其附屬庫(其重達數百千位元組),則這種添加幾乎不會被注意到。
  • 延遲處理:庫延遲處理項目,透過避免不必要的中間資料複製,可以減少記憶體使用並提高長管道的效率。

注意事項

庫已未轉譯到 ES5。這項決定是由於希望保持較小的套件大小而做出的,這是透過利用 ES6 功能來實現的,這些功能支援使用非常簡潔的程式碼進行迭代——最值得注意的是生成器。但是,僅利用廣泛支援的語言功能。

如果您仍在編譯到 ES5,您可以透過自己編譯並新增 polyfill 來使用該函式庫。但請注意,這會增加捆綁包的大小,因此不建議這樣做。相反,這可能是重新審視建立配置並擁抱現代 JavaScript 功能的最佳時機。

祝你編碼愉快!

以上是Fluent Streams:用於豐富可迭代操作的函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:dev.to
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板