V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
lizy0329
V2EX  ›  程序员

你们觉得 Ramda 这个库咋样?

  •  
  •   lizy0329 · 2 天前 · 1232 次点击

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

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

    14 条回复    2025-10-30 21:08:14 +08:00
    zhengfan2016
        1
    zhengfan2016  
       2 天前
    看着像小 lodash
    lizy0329
        2
    lizy0329  
    OP
       2 天前
    @zhengfan2016 个人觉得比 lodash 强大 10000 倍
    abc1310054026
        3
    abc1310054026  
       2 天前
    要比喻的话更像是链式 rxjs 。写的人爽了,维护的人不懂可就惨了
    qs
        4
    qs  
       2 天前 via iPhone
    16 年的时候好像写游戏客户端的同事就用这个来着

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

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

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

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

    但是,如果你在写一个很基础、会被高频调用的功能,这点性能损失可能就会被百倍千倍的放大。如果是这种场景,建议还是在一个 for 循环里,把要做的几个操作( filter 、map 、reduce 等)一次性全做了。
    zaneliu
        7
    zaneliu  
       1 天前   ❤️ 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
        8
    xuyihao  
       1 天前
    @zaneliu 你这有点像 AI 生成的啊
    encounter2017
        9
    encounter2017  
       9 小时 22 分钟前   ❤️ 1
    简单看了下,没理解为啥要弄出来一个 addIndex 后,还要弄一个 addIndexRight, 作为一个“函数式”的库,不应该直接用 map 来实现吗?而且 add 和 addIndex 听起来就有歧义,为啥前者直接就是算数加法,后者就是添加成一个 tuple ?
    const arr = ["a", "b", "c"];

    const res = Array.from(arr.entries()).map(([i, v]) => [v, i + 1]);
    lizy0329
        10
    lizy0329  
    OP
       8 小时 56 分钟前
    @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
        11
    nzbin  
       6 小时 53 分钟前
    @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
        12
    zaneliu  
       4 小时 47 分钟前
    @xuyihao 我可以理解是在夸我吗哈哈哈哈~

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

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

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

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

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

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

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

    Ps: 推这篇博文的目的也是帮助更多人在写枯燥的业务代码之余,也可以尝试换换脑子,换一种思路,尝试从「函数」层面进行业务抽象,让代码更模块化、更可复用,祝早点下班~
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   2292 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 21ms · UTC 16:02 · PVG 00:02 · LAX 09:02 · JFK 12:02
    ♥ Do have faith in what you're doing.