作品: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中文网其他相关文章!