Skip to content

Ramda 函数式编程库

Ramda 是一个 JavaScript 函数式编程(Functional Programming, FP)库,它提供了一系列实用的函数工具,帮助开发者以更简洁、声明式的方式编写代码。

与 Lodash 类似,但 Ramda 的设计更注重 函数式编程范式,强调 不可变性(Immutability) 和 纯函数(Pure Functions),并采用 柯里化(Currying) 和 函数组合(Function Composition) 来提高代码的可复用性和可读性。


Ramda 的核心特点1. 函数优先(Function-First) Ramda 的函数通常把 数据放在最后,而不是像 Lodash 那样放在第一个参数:

javascript
// Lodash(数据在前)
_.map([1, 2, 3], x => x * 2); // [2, 4, 6]

// Ramda(函数在前,数据在后)
R.map(x => x * 2, [1, 2, 3]); // [2, 4, 6]

或者使用 柯里化,让函数更灵活:

javascript
const double = R.map(x => x * 2);
double([1, 2, 3]); // [2, 4, 6]

2. 柯里化(Currying) Ramda 的函数默认支持 柯里化,即可以部分应用参数:

javascript
const add = R.curry((a, b) => a + b);
const add5 = add(5); // 部分应用,固定第一个参数为 5
add5(3); // 8

这在函数组合时非常有用。


3. 函数组合(Function Composition) Ramda 提供 R.pipeR.compose 来组合多个函数:

javascript
const double = x => x * 2;
const add1 = x => x + 1;

// pipe:从左到右执行
const pipeline = R.pipe(double, add1);
pipeline(5); // (5 * 2) + 1 = 11

// compose:从右到左执行(类似数学中的 f(g(x)))
const composed = R.compose(add1, double);
composed(5); // (5 * 2) + 1 = 11

4. 不可变性(Immutability) Ramda 的所有函数都不会修改原始数据,而是返回新数据:

javascript
const obj = { a: 1, b: 2 };
const newObj = R.assoc('c', 3, obj); // 添加新属性
console.log(obj); // { a: 1, b: 2 }(原对象不变)
console.log(newObj); // { a: 1, b: 2, c: 3 }

5. 丰富的工具函数 Ramda 提供了大量实用的函数,涵盖: • 集合操作(map, filter, reduce

• 对象操作(assoc, dissoc, merge

• 数组操作(slice, concat, uniq

• 函数式工具(curry, compose, pipe

• 逻辑运算(R.ifElse, R.when, R.unless

• 字符串处理(R.replace, R.split, R.join


Ramda vs Lodash

特性RamdaLodash
函数式编程✅ 强调 FP 范式❌ 更偏向命令式
柯里化✅ 默认支持❌ 需要手动实现
函数组合pipe/compose❌ 无原生支持
数据不可变✅ 所有函数返回新数据❌ 部分函数可修改原数据
API 设计函数在前,数据在后数据在前,函数在后

安装 Ramda

bash
npm install ramda
# 或
yarn add ramda

或直接通过 CDN 使用:

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.28.0/ramda.min.js"></script>

简单示例

javascript
const R = require('ramda');

// 1. 过滤偶数并平方
const numbers = [1, 2, 3, 4, 5];
const result = R.pipe(
  R.filter(n => n % 2 === 0), // [2, 4]
  R.map(n => n * n)           // [4, 16]
)(numbers);

console.log(result); // [4, 16]

// 2. 对象操作
const user = { name: 'Alice', age: 25 };
const updatedUser = R.assoc('age', 26, user); // { name: 'Alice', age: 26 }

总结

• Ramda 是一个函数式编程库,适合喜欢 声明式编程 的开发者。

• 强调不可变性、柯里化和函数组合,使代码更简洁、可复用。

• 与 Lodash 相比,更适合函数式编程场景,但学习曲线稍高。

Released under the MIT License.