Fluent Streams:丰富的可迭代操作库
想象一个图书馆:
我找不到一个可以满足所有这些需求的库,因此我创建了自己的小型库 — fluent-streams。
说话没多大用处。给我看代码
文本中出现的前 3 个单词
const words = ['Lorem', 'ipsum', /* ... */] stream(words) .groupBy(word => word.toLowerCase()) .map(([w, {length}]) => [w, 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(([a, b]) => a < b ? `${a},${b}` : `${b},${a}`) .take(10) // => [804, 835], [589, 642], [96, 145], ...
生成一副牌
const deck = streamOf('♠', '♥', '♣', '♦') .flatMap(suit => streamOf( '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) .splitWhen((_l, _r, i) => i === 2 // flop || i === 3 // turn || i >= 4 // river && i % 2 === 0 // ...players' hands ) // flop = ['3♦', '9♣', 'J♦'] // turn = ['4♣'] // river = ['7♦'] // hands = ['J♠', 'Q♥'], ['10♠', '8♥']
第一个玩家在翻牌时有一对 J,而第二个玩家在河牌时拿到顺子。谁会赢?
这一定很便宜
以上所有内容都只能通过原生数据结构实现。但是,使用 Fluent Streams 编写的代码读起来更顺畅。虽然让代码更具可读性是一个完全合理的目标,但实现这一目标的成本在认知负荷、包大小和性能方面应该很低。
Fluent Streams 正是如此!原因如下:
注意事项
该库在交付时**未转译**为 ES5。做出这一决定是出于保持较小包大小的愿望,这通过利用 ES6+ 功能来实现,这些功能支持使用非常简洁的代码进行迭代 - 最值得注意的是生成器。但是,仅使用广泛支持的语言功能。
如果您仍在转译为 ES5,您可以通过自行转译并添加 polyfill 来使用该库。但请注意,这会增加包大小,因此不建议这样做。相反,这可能是重新审视您的构建配置并采用现代 JavaScript 功能的绝佳时机。