你们觉得 Ramda 这个库咋样?

2 天前
 lizy0329

官方文档: https://ramdajs.com/docs/

链式操作,惊为天人,现在有 AI 来干活,感觉不是那么难写了

1232 次点击
所在节点    程序员
14 条回复
zhengfan2016
2 天前
看着像小 lodash
lizy0329
2 天前
@zhengfan2016 个人觉得比 lodash 强大 10000 倍
abc1310054026
2 天前
要比喻的话更像是链式 rxjs 。写的人爽了,维护的人不懂可就惨了
qs
2 天前
16 年的时候好像写游戏客户端的同事就用这个来着

当时就说很方便了
lizy0329
2 天前
@abc1310054026 现在可以完全交给 AI 写,方便多了
justdoit123
1 天前
链式操作的场景其实没那么多。

倒是可以多借鉴一些函数的功能,对常用的 list (或者数组)、dict 等操作进行封装。

我写 python 看到满屏幕的 [x for x in yyy if ba la ba la] 都看麻了。

另外,要提醒。这种链式组合操作的性能其实不好。当然,大部分场景无需考虑。

但是,如果你在写一个很基础、会被高频调用的功能,这点性能损失可能就会被百倍千倍的放大。如果是这种场景,建议还是在一个 for 循环里,把要做的几个操作( filter 、map 、reduce 等)一次性全做了。
zaneliu
1 天前
当我们在讨论 Ramda 时,究竟在讨论什么?

不妨静下心来细想:

是 lodash 吗? 是 RxJS 吗? 是链式调用吗?

这些元素在 Ramda 中确实都有体现,但它们并非使用 Ramda 的真正理由,更不是其设计时的初衷。

可以看下 Ramda 官网第一行醒目的简介:

> Ramda
> A practical functional library for JavaScript programmers.

它声称自己是一个「实用的函数式( functional )」库。

没错,它是一个完全遵循函数式(不只是简简单单的柯里化、闭包)的、彻底拥抱函数式思想的工具库。


所以如果想真正用好 Ramda ,可以先从学习「函数式思想」开始。

此处不展开,推荐一篇网易云大前端博文:

https://musicfe.com/javascript-functional-programming-quickstart/

函数式编程确实优雅、简洁,很多人初次接触也「惊为天人」,但软件开发没有银弹,我们追求的是**在合适的场景,用合适的技术,更高效地解决问题**。

请勿陷入“为了用 Ramda 而用 Ramda”的误区。
xuyihao
1 天前
@zaneliu 你这有点像 AI 生成的啊
encounter2017
9 小时 27 分钟前
简单看了下,没理解为啥要弄出来一个 addIndex 后,还要弄一个 addIndexRight, 作为一个“函数式”的库,不应该直接用 map 来实现吗?而且 add 和 addIndex 听起来就有歧义,为啥前者直接就是算数加法,后者就是添加成一个 tuple ?
const arr = ["a", "b", "c"];

const res = Array.from(arr.entries()).map(([i, v]) => [v, i + 1]);
lizy0329
9 小时 1 分钟前
@encounter2017 因为 Ramda 是函数式的工具,是柯里化,可组合,链式的,所以必须让每个函数的计算非常存粹,所以 R.map 他只返回 value ,要变成原生的 map 必须 const mapNative = R.addIndex(R.map);

所以会有三种不同的创建 map 方法:
['f', 'o', 'o', 'b', 'a', 'r']
正:R.addIndex(R.map) // ['0-f', '1-o', '2-o', '3-b', '4-a', '5-r']
正逆:R.addIndexRight(R.map) // ['5-f', '4-o', '3-o', '2-b', '1-a', '0-r']
逆:R.addIndexRight((fn, ary) => R.map(fn, R.reverse(ary))) // ['5-r', '4-a', '3-b', '2-o', '1-o', '0-f']

至于 add 和 addIndex 听起来就有歧义,应该是函数式那些作者定义的
nzbin
6 小时 58 分钟前
@zaneliu #7
看完之后,我反倒觉得 rxjs 更能体现“流水线”这种思想

https://rxjs.tech/guide/overview

fromEvent(document, 'click')
.pipe(
throttleTime(1000),
map((event) => event.clientX),
scan((count, clientX) => count + clientX, 0)
)
.subscribe((count) => console.log(count));
zaneliu
4 小时 53 分钟前
@xuyihao 我可以理解是在夸我吗哈哈哈哈~

我之前也在公司做过一次「函数式编程的分享」,正好看到这个帖子,结合我自己的理解有感而发,并不是 AI 生成的哈~

https://cdn.zaneliu.me/2025/10/GoOpSE.jpg
lizy0329
4 小时 38 分钟前
@nzbin rxjs 对项目的侵入太大,如果你团队都用还好,不然就只有直挠头。Ramda 用于数据的转换还好
zaneliu
2 小时 59 分钟前
@nzbin 没问题,官网的这些例子也充分展示了 RxJS 的简洁强大~

其实有很多人也都是从 RxJS 处理事件流开始接触函数式编程的,RxJS 的这些设计也十分适合处理事件流。

而 RxJS 的函数式部分,更多是服务于它的响应式基础(它的定位就是:提供一种新的方案,将函数式与「观察者」、「迭代器」模式结合,更优雅的处理事件流),而与之对比,Ramda 就纯纯是个 FP 的 utils 库而已~

我认为不管是 RxJS 、Ramda ,还是简单的 pipe/compose/flow 这些,
本质上都是体现的函数式编程的思维方式:「函数是一等公民」。

意思就是,函数可以像变量一样被「随意传递」、「返回」、「组合」,远离副作用、流水账或面条代码~。

坦白讲,我更喜欢用 Ramda 组合一些 helpers 来处理 RxJS 的数据流 :)

Ps: 推这篇博文的目的也是帮助更多人在写枯燥的业务代码之余,也可以尝试换换脑子,换一种思路,尝试从「函数」层面进行业务抽象,让代码更模块化、更可复用,祝早点下班~

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://ex.noerr.eu.org/t/1168848

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX