Ramda 函数库参考教程

  • 2017-03-30
  • 21
  • 0

学习函数式编程的过程中,我接触到了 Ramda.js

我发现,这是一个很重要的库,提供了许多有用的方法,每个 JavaScript 程序员都应该掌握这个工具。

Ramda 函数库参考教程

你可能会问,UnderscoreLodash 已经这么流行了,为什么还要学习好像雷同的 Ramda 呢?

回答是,前两者的参数位置不对,把处理的数据放到了第一个参数。

上面代码中,_.map的第一个参数[4, 8]是要处理的数据,第二个参数square是数据要执行的运算。

Ramda 的数据一律放在最后一个参数,理念是”function first,data last“。

为什么 Underscore 和 Lodash 是错的,而 Ramda 是对的?这放在下一篇文章详细解释,今天我主要介绍 Ramda 提供的几十个方法。这是理解以后的内容所必须的。

除了数据放在最后一个参数,Ramda 还有一个特点:所有方法都支持柯里化

Ramda 函数库参考教程

也就是说,所有多参数的函数,默认都可以单参数使用。

上面代码中,写法一是多参数版本,写法二是柯里化以后的单参数版本。Ramda 都支持,并且推荐使用第二种写法。

Ramda 函数库参考教程

由于这两个特点,使得 Ramda 成为 JavaScript 函数式编程最理想的工具库。今天,我先介绍它的 API,下一次再介绍这些方法如何用于实战。我保证,一旦你理解了它的运算模型,就一定会认同这才是正确的计算方法。

下面所有的示例,都可以在线上测试环境运行。

Ramda API 介绍

目录

一、比较运算
二、数学运算
三、逻辑运算
四、字符串
五、函数
– 5.1 函数的合成
– 5.2 柯里化
– 5.3 函数的执行
六、数组
– 6.1 数组的特征判断
– 6.2 数组的截取和添加
– 6.3 数组的过滤
– 6.4 单数组运算
– 6.5 双数组运算
– 6.6 复合数组
七、对象
– 7.1 对象的特征判断
– 7.2 对象的过滤
– 7.3 对象的截取
– 7.4 对象的运算
– 7.5 复合对象

一、比较运算

gt:判断第一个参数是否大于第二个参数。

gte:判断第一个参数是否大于等于第二个参数。

lt:判断第一个参数是否小于第二个参数。

lte:判断第一个参数是否小于等于第二个参数。

equals:比较两个值是否相等(支持对象的比较)。

eqBy:比较两个值传入指定函数的运算结果是否相等。

二、数学运算

add:返回两个值的和。

subtract:返回第一个参数减第二个参数的差。

multiply:返回两个值的积。

divide:返回第一个参数除以第二个参数的商。

三、逻辑运算

either:接受两个函数作为参数,只要有一个返回true,就返回true,否则返回false。相当于||运算。

both:接受两个函数作为参数,只有它们都返回true,才返回true,否则返回false,相当于&&运算。

allPass:接受一个函数数组作为参数,只有它们都返回true,才返回true,否则返回false

四、字符串

split:按照指定分隔符将字符串拆成一个数组。

test:判断一个字符串是否匹配给定的正则表达式。

match:返回一个字符串的匹配结果。

五、函数

5.1 函数的合成

compose:将多个函数合并成一个函数,从右到左执行。

pipe:将多个函数合并成一个函数,从左到右执行。

converge:接受两个参数,第一个参数是函数,第二个参数是函数数组。传入的值先使用第二个参数包含的函数分别处理以后,再用第一个参数处理前一步生成的结果。

5.2 柯里化

curry:将多参数的函数,转换成单参数的形式。

partial:允许多参数的函数接受一个数组,指定最左边的部分参数。

partialRight:与partial类似,但数组指定的参数为最右边的参数。

useWith:接受一个函数fn和一个函数数组fnList作为参数,返回fn的柯里化版本。该新函数的参数,先分别经过对应的fnList成员处理,再传入fn执行。

memoize:返回一个函数,会缓存每一次的运行结果。

complement:返回一个新函数,如果原函数返回true,该函数返回false;如果原函数返回false,该函数返回true

5.3 函数的执行

binary:参数函数执行时,只传入最前面两个参数。

tap:将一个值传入指定函数,并返回该值。

zipWith:将两个数组对应位置的值,一起作为参数传入某个函数。

apply:将数组转成参数序列,传入指定函数。

applySpec:返回一个模板函数,该函数会将参数传入模板内的函数执行,然后将执行结果填充到模板。

ascend:返回一个升序排列的比较函数,主要用于排序。

descend:返回一个降序排列的比较函数,主要用于排序。

六、数组

6.1 数组的特征判断

contains:如果包含某个成员,返回true

all:所有成员都满足指定函数时,返回true,否则返回false

any:只要有一个成员满足条件,就返回true

none:没有成员满足条件时,返回true

6.2 数组的截取和添加

head:返回数组的第一个成员。

last:返回数组的最后一个成员。

tail:返回第一个成员以外的所有成员组成的新数组。

init:返回最后一个成员以外的所有成员组成的新数组。

nth:取出指定位置的成员。

take:取出前 n 个成员。

takeLast:取出后 n 个成员。

slice:从起始位置(包括)开始,到结束位置(不包括)为止,从原数组截取出一个新数组。

remove:移除开始位置后的n个成员。

insert:在指定位置插入给定值。

insertAll:在指定位置,插入另一个数组的所有成员。

prepend:在数组头部插入一个成员

append:在数组尾部追加新的成员。

intersperse:在数组成员之间插入表示分隔的成员。

join:将数组合并成一个字符串,并在成员之间插入分隔符。

6.3 数组的过滤

filter:过滤出符合条件的成员。

reject:过滤出所有不满足条件的成员。

takeWhile: 一旦满足条件,后面的成员都会被过滤。

dropWhile:一旦不满足条件,取出剩余的所有成员。

without:返回指定值以外的成员。

6.4 单数组运算

countBy:对每个成员执行指定函数以后,返回一个对象,表示各种执行结果分别包含多少成员。

splitAt:在给定位置,将原数组分成两个部分。

splitEvery:按照指定的个数,将原数组分成多个部分。

splitWhen:以第一个满足指定函数的成员为界,将数组分成两个部分。

aperture:每个成员与其后给定数量的成员分成一组,这些组构成一个新的数组。

partition:根据是否满足指定函数,将成员分区。

indexOf:某个值在数组中第一次出现的位置。

lastIndexOf:某个值在数组中最后一次出现的位置。

map:数组的每个成员依次执行某个函数。

mapIndexed:与map类似,区别是遍历函数可以额外获得两个参数:索引位置和原数组。

forEach:数组的每个成员依次执行某个函数,总是返回原数组。

reduce:数组成员依次执行指定函数,每一次的运算结果都会进入一个累积变量。

reduceRight:与reduce类似,区别是数组成员从左到右执行。

reduceWhile:与reduce类似,区别是有一个判断函数,一旦数组成员不符合条件,就停止累积。

sort:按照给定函数,对数组进行排序。

sortWith:按照给定的一组函数,进行多重排序。

adjust:对指定位置的成员执行给定的函数。

ap:数组成员分别执行一组函数,将结果合成为一个新数组。

flatten:将嵌套数组铺平。

groupBy:将数组成员依次按照指定条件两两比较,并按照结果将所有成员放入子数组。

6.5 双数组运算

concat:将两个数组合并成一个数组。

zip:将两个数组指定位置的成员放在一起,生成一个新数组。

zipObj:将两个数组指定位置的成员分别作为键名和键值,生成一个新对象。

xprod:将两个数组的成员两两混合,生成一个新数组。

intersection:返回两个数组相同的成员组成的新数组。

intersectionWith:返回经过某种运算,有相同结果的两个成员。

difference:返回第一个数组不包含在第二个数组里面的成员。

differenceWith:返回执行指定函数后,第一个数组里面不符合条件的所有成员。

symmetricDifference:返回两个数组的非共有成员所组成的一个新数组。

symmetricDifferenceWith:根据指定条件,返回两个数组所有运算结果不相等的成员所组成的新数组。

6.6 复合数组

find:返回符合指定条件的成员。

findIndex:返回符合指定条件的成员的位置。

findLast:返回最后一个符合指定条件的成员。

findLastIndex:返回最后一个符合指定条件的成员的位置。

pluck:取出数组成员的某个属性,组成一个新数组。

project:取出数组成员的多个属性,组成一个新数组。

transpose:将每个成员相同位置的值,组成一个新数组。

mergeAll:将数组的成员合并成一个对象。

fromPairs:将嵌套数组转为一个对象。

groupBy:将数组成员按照指定条件分组。

sortBy:根据成员的某个属性排序。

七、对象

7.1 对象的特征判断

has: 返回一个布尔值,表示对象自身是否具有该属性。

hasIn:返回一个布尔值,表示对象自身或原型链上是否具有某个属性。

propEq:如果属性等于给定值,返回true

whereEq:如果属性等于给定值,返回true

where:如果各个属性都符合指定条件,返回true

7.2 对象的过滤

omit:过滤指定属性。

filter:返回所有满足条件的属性

reject:返回所有不满足条件的属性

7.3 对象的截取

dissoc:过滤指定属性。

assoc:添加或改写某个属性。

partition:根据属性值是否满足给定条件,将属性分区。

pick:返回指定属性组成的新对象

pickAll:与pick类似,但会包括不存在的属性。

pickBy:返回符合条件的属性

keys:返回对象自身属性的属性名组成的新数组。

keysIn:返回对象自身的和继承的属性的属性名组成的新数组。

values:返回对象自身的属性的属性值组成的数组。

valuesIn:返回对象自身的和继承的属性的属性值组成的数组。

invertObj:将属性值和属性名互换。如果多个属性的属性值相同,只返回最后一个属性。

invert:将属性值和属性名互换,每个属性值对应一个数组。

7.4 对象的运算

prop:返回对象的指定属性

map:对象的所有属性依次执行某个函数。

mapObjIndexed:与map类似,但是会额外传入属性名和整个对象。

forEachObjIndexed:每个属性依次执行给定函数,给定函数的参数分别是属性值和属性名,返回原对象。

merge:合并两个对象,如果有同名属性,后面的值会覆盖掉前面的值。

mergeWith:合并两个对象,如果有同名属性,会使用指定的函数处理。

eqProps:比较两个对象的指定属性是否相等。

R.evolve:对象的属性分别经过一组函数的处理,返回一个新对象。

7.5 复合对象

path:取出数组中指定路径的值。

pathEq:返回指定路径的值符合条件的成员

assocPath:添加或改写指定路径的属性的值。

(完)

评论

还没有任何评论,也用不到你