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模块更是提供了一种更友好的函数式编程风格,让我们能够更轻松地使用函数式编程的方式解决问题。