1. 引言
lodash,一个JavaScript的实用工具库,它提供了诸多方便的方法来处理数组、对象和函数等。你可能在日常开发中已经使用过lodash, 只限于防抖、节流等。
那lodash仅仅是一个工具函数库吗?你是否真正了解lodash呢?
本文将从lodash的角度去体会函数式编程的魅力。
之前写过JavaScript中的函数式编程大家可作参考。
2. 函数式编程的理念
函数式编程,是以函数为核心的编程范式。它的基本原则包括:不可变性、、简洁性、函数是一等公民等。
在函数式编程中,将函数作为一等公民,可以进行柯里化、组合和高阶函数等操作,这有助于减少代码重复和提高代码的复用性。函数式编程的优点在于其纯粹性和可预测性,使得代码更易于测试和维护。
3. lodash中的组合函数
我们看一个_.flowRight函数: 功能是创建一个函数,返回的结果是调用提供函数的结果,this 会绑定到创建函数。 每一个连续调用,传入的参数都是前一个函数返回的结果。
举例: 获取数组中的最后一个元素,并转换成大写
const arr = ["one", "two", "three"];
// 正常写法 嵌套方式
const res = _.toUpper(_.first(_.reverse(arr)))
// 组合函数写法
const fn = _.flowRight(_.toUpper, _.first, _.reverse);
const ret = fn(arr)
很明显使用组合函数,使的代码可读性更高,易于维护。组合函数中每一个函数的返回值,会当做实参传递给下一个函数,避免每次传递。
4. lodash/fp模块
lodash/fp模块模块通过导出一个实例化的lodash,其方法被包装以产生不可变的、自动柯里化的、迭代优先的、数据为后的方法,从而提倡更加友好的函数式编程(FP)风格。
这么说很抽象,直接看一个实际的例子,将数组中的每一项转换成大写:
// 数据优先
const _ = require("lodash");
const arr = ["a", "b", "c"];
console.log(_.map(["a", "b", "c"], _.toUpper));
const str = "hello world";
console.log(_.split(str, " "));
// 数据最后 自动柯里化
const fp = require("lodash/fp");
console.log(fp.map(_.toUpper, arr));
console.log(fp.split(" ")(str));
console.log(fp.split(" ", str));
通过这个案例理解fp是产生不可变的、自动柯里化的、迭代优先的、数据为后的方法。那这对于我们解决问题有什么作用呢?
再看一个案例,理解fp的作用:
将字符转换 NEVER SAY DIE -> never-say-die
// 先空格split切割成数组,调用toLower变成小写,然后进行join分隔
/* ===================== lodash普通函数 ====================== */
const _ = require("lodash");
const str = "NEVER SAY DIE"
// 因为使用组合函数,数据是最后进行传入,所以需要柯里化进行数据位置变化 进行改造
const split = _.curry((sep, str) => _.split(str, sep));
const join = _.curry((sep, arr) => _.join(arr, sep));
const map = _.curry((fn, array) => _.map(array, fn));
const trace = _.curry((tag, v) => {
console.log(tag, v);
return v;
});
const f = _.flowRight(
join("-"),
trace("map 之后"),
map(_.toLower),
trace("split 之后"),
split(" ")
);
console.log(f(str))
/* ================== 使用fp ================= */
const fp = require("lodash/fp");
const ffp = fp.flowRight(
fp.join("-"),
trace("map 之后"),
fp.map(fp.toLower),
trace("split 之后"),
fp.split(" ")
);
console.log(ffp(str));
结果:
从上述两段代码可以看出,fp模块可以自动柯里化,函数优先的思想。每一个函数都是纯函数,相同的输入有相同的输出,可复用,易于维护。
5. 总结
lodash不仅仅是一个工具库,它也是函数式编程的优秀代表,展现了函数式编程的思想。lodash的组合函数、高阶函数、柯里化等可以帮助我们更简洁、更易于维护地解决问题。
而lodash/fp模块更是提供了一种更友好的函数式编程风格,让我们能够更轻松地使用函数式编程的方式解决问题。
希望大家对大家在理解函数式编程上有一点帮助O^O!。