• 从lodash的角度去体会函数式编程的魅力
  • 发布于 2个月前
  • 470 热度
    0 评论
一. 引言

lodash,一个JavaScript的实用工具库,它提供了诸多方便的方法来处理数组、对象和函数等。你可能在日常开发中已经使用过lodash, 只限于防抖、节流等。那lodash仅仅是一个工具函数库吗?你是否真正了解lodash呢?本文将从lodash的角度去体会函数式编程的魅力。


之前写过JavaScript中的函数式编程大家可作参考。


二. 函数式编程的理念

函数式编程,是以函数为核心的编程范式。它的基本原则包括:不可变性、、简洁性、函数是一等公民等。在函数式编程中,将函数作为一等公民,可以进行柯里化、组合和高阶函数等操作,这有助于减少代码重复和提高代码的复用性。函数式编程的优点在于其纯粹性和可预测性,使得代码更易于测试和维护。


三. lodash中的组合函数
我们看一个_.flowRight函数: 功能是创建一个函数,返回的结果是调用提供函数的结果,this 会绑定到创建函数。 每一个连续调用,传入的参数都是前一个函数返回的结果。
举例: 获取数组中的最后一个元素,并转换成大写
const arr = ["one", "two", "three"];
// 正常写法 嵌套方式
const res = _.toUpper(_.first(_.reverse(arr)))
// 堆代码 duidaima.com
// 组合函数写法
const fn = _.flowRight(_.toUpper, _.first, _.reverse);
const ret = fn(arr)

很明显使用组合函数,使的代码可读性更高,易于维护。组合函数中每一个函数的返回值,会当做实参传递给下一个函数,避免每次传递。
四. 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模块可以自动柯里化,函数优先的思想。每一个函数都是纯函数,相同的输入有相同的输出,可复用,易于维护。


五. 总结

lodash不仅仅是一个工具库,它也是函数式编程的优秀代表,展现了函数式编程的思想。lodash的组合函数、高阶函数、柯里化等可以帮助我们更简洁、更易于维护地解决问题。而lodash/fp模块更是提供了一种更友好的函数式编程风格,让我们能够更轻松地使用函数式编程的方式解决问题。


希望大家对大家在理解函数式编程上有一点帮助O^O!。

用户评论