Fluent Streams:用于丰富可迭代操作的库
作品: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中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JavaScript是现代Web开发的基石,它的主要功能包括事件驱动编程、动态内容生成和异步编程。1)事件驱动编程允许网页根据用户操作动态变化。2)动态内容生成使得页面内容可以根据条件调整。3)异步编程确保用户界面不被阻塞。JavaScript广泛应用于网页交互、单页面应用和服务器端开发,极大地提升了用户体验和跨平台开发的灵活性。

JavaScript的最新趋势包括TypeScript的崛起、现代框架和库的流行以及WebAssembly的应用。未来前景涵盖更强大的类型系统、服务器端JavaScript的发展、人工智能和机器学习的扩展以及物联网和边缘计算的潜力。

不同JavaScript引擎在解析和执行JavaScript代码时,效果会有所不同,因为每个引擎的实现原理和优化策略各有差异。1.词法分析:将源码转换为词法单元。2.语法分析:生成抽象语法树。3.优化和编译:通过JIT编译器生成机器码。4.执行:运行机器码。V8引擎通过即时编译和隐藏类优化,SpiderMonkey使用类型推断系统,导致在相同代码上的性能表现不同。

JavaScript是现代Web开发的核心语言,因其多样性和灵活性而广泛应用。1)前端开发:通过DOM操作和现代框架(如React、Vue.js、Angular)构建动态网页和单页面应用。2)服务器端开发:Node.js利用非阻塞I/O模型处理高并发和实时应用。3)移动和桌面应用开发:通过ReactNative和Electron实现跨平台开发,提高开发效率。

Python更适合初学者,学习曲线平缓,语法简洁;JavaScript适合前端开发,学习曲线较陡,语法灵活。1.Python语法直观,适用于数据科学和后端开发。2.JavaScript灵活,广泛用于前端和服务器端编程。

本文展示了与许可证确保的后端的前端集成,并使用Next.js构建功能性Edtech SaaS应用程序。 前端获取用户权限以控制UI的可见性并确保API要求遵守角色库

从C/C 转向JavaScript需要适应动态类型、垃圾回收和异步编程等特点。1)C/C 是静态类型语言,需手动管理内存,而JavaScript是动态类型,垃圾回收自动处理。2)C/C 需编译成机器码,JavaScript则为解释型语言。3)JavaScript引入闭包、原型链和Promise等概念,增强了灵活性和异步编程能力。

JavaScript不需要安装,因为它已内置于现代浏览器中。你只需文本编辑器和浏览器即可开始使用。1)在浏览器环境中,通过标签嵌入HTML文件中运行。2)在Node.js环境中,下载并安装Node.js后,通过命令行运行JavaScript文件。
