作品:https://code-art.pictures/
想像圖書館:
我找不到一個能夠滿足所有這些需求的函式庫,所以我建立了我的小函式庫 - Fluent-streams。
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], ...
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 正是如此!原因如下:
庫已未轉譯到 ES5。這項決定是由於希望保持較小的套件大小而做出的,這是透過利用 ES6 功能來實現的,這些功能支援使用非常簡潔的程式碼進行迭代——最值得注意的是生成器。但是,僅利用廣泛支援的語言功能。
如果您仍在編譯到 ES5,您可以透過自己編譯並新增 polyfill 來使用該函式庫。但請注意,這會增加捆綁包的大小,因此不建議這樣做。相反,這可能是重新審視建立配置並擁抱現代 JavaScript 功能的最佳時機。
以上是Fluent Streams:用於豐富可迭代操作的函式庫的詳細內容。更多資訊請關注PHP中文網其他相關文章!