闽公网安备 35020302035485号
lodash,一个JavaScript的实用工具库,它提供了诸多方便的方法来处理数组、对象和函数等。你可能在日常开发中已经使用过lodash, 只限于防抖、节流等。那lodash仅仅是一个工具函数库吗?你是否真正了解lodash呢?本文将从lodash的角度去体会函数式编程的魅力。
之前写过JavaScript中的函数式编程大家可作参考。
函数式编程,是以函数为核心的编程范式。它的基本原则包括:不可变性、、简洁性、函数是一等公民等。在函数式编程中,将函数作为一等公民,可以进行柯里化、组合和高阶函数等操作,这有助于减少代码重复和提高代码的复用性。函数式编程的优点在于其纯粹性和可预测性,使得代码更易于测试和维护。
const arr = ["one", "two", "three"]; // 正常写法 嵌套方式 const res = _.toUpper(_.first(_.reverse(arr))) // 堆代码 duidaima.com // 组合函数写法 const fn = _.flowRight(_.toUpper, _.first, _.reverse); const ret = fn(arr)
// 数据优先
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是产生不可变的、自动柯里化的、迭代优先的、数据为后的方法。那这对于我们解决问题有什么作用呢?// 先空格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模块可以自动柯里化,函数优先的思想。每一个函数都是纯函数,相同的输入有相同的输出,可复用,易于维护。
lodash不仅仅是一个工具库,它也是函数式编程的优秀代表,展现了函数式编程的思想。lodash的组合函数、高阶函数、柯里化等可以帮助我们更简洁、更易于维护地解决问题。而lodash/fp模块更是提供了一种更友好的函数式编程风格,让我们能够更轻松地使用函数式编程的方式解决问题。