首页 >web前端 >js教程 >Fluent Streams:用于丰富可迭代操作的库

Fluent Streams:用于丰富可迭代操作的库

Susan Sarandon
Susan Sarandon原创
2024-12-15 16:24:16209浏览

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn