函数形式转换查询表

R.ap

先转换后将自己和转换的值作为参数传入函数处理。仅限于两个函数,都处理同一个参数
循环函数,依次调用参数为数组的子元素,并返回函数调用结果,最后铺平
函数(多)对参数(多)的关系
一般转换方式:[[fn1(n), fn1(n1), fn1(n2)], [fn2(n), fn2(n1), fn2(n2)]] => R.ap[fn1, fn2]([n, n1, n2])
特殊转换方式(两个函数作为参数时):v => firstFn(v, nextFn(v)) => R.ap(firstFn, nextFn)(v)

// 一般转换方式
const fn = R.ap([R.add(1), R.add(2)]); //=> [2, 4, 6, 4, 5, 6]
let r2 = fn([1,2,3])
console.log(r2) // flatten后的结果
// 特殊转换方式
// 调用第一个函数后得到结果1,结果1和自己作为参数传入第二个函数调用。
R.ap(R.concat, R.toUpper)('Ramda') //=> 'RamdaRAMDA'

R.juxt

循环函数,传入一个参数,函数依次调用参数,返回结果
函数(多)对参数(1)的关系

[fn1(n), fn2(n)] => R.juxt([fn1, fn2])(n)
const jfn = R.juxt([R.add(2), R.add(1)]); //=> [2, 4, 6, 4, 5, 6]
let r3 = jfn(1) // [3, 2]
console.log(r3)

R.on

P combinator (粘合函数):将两个值同时经过一个函数调用后,将两者的结果作为参数传入最终的函数进行最后处理。可以看作是R.coverage的定制版本(注1)
接收一个二元函数 f,一个一元函数 g 和两个值。将两个值应用到函数 g 上,在把返回的结果应用到函数 f 上。

注1:R.coverage可以多分支,这里是两个分支,主要区别是R.on两个数据都是经过同一个函数处理,而R.coverage是不同函数(当然也可以同个函数)处理,所以经过不同函数处理使用R.coverage,同个函数处理使用R.on,另外一个区别是,R.on接受两个参数

特点总结:

  • 两个参数
  • 同一个函数处理过程
  • 最后被作为参数传参给总函数调用
// f(g(v1), g(v2)) => R.on(f, g)(v1, v2)
// const eqBy = R.on((a, b) => a === b);
// let r = eqBy(R.prop('a'), {b:0, a:1}, {a:1}) //=> true;
// console.log(r) // true
const containsInsensitive = R.on(R.includes, R.toLower); // 文档里面有误
let r2 = containsInsensitive('o', 'FOO'); //=> true
console.log(r2) // true

R.promap

促销活动,当前,先后函数
函数调用一个参数将结果依次传递给其他两个函数
转换方式:g(h(f(x))) => promap(f, g, h)(x)

const a = R.append(4)
const b = R.prepend(2)
const c = R.concat([3])
// const c = R.take(2)
let fn = R.promap(a, c, b)
let r = fn([1,2,3])
console.log(r)

R.sequence

生成数组序列,并保留参数自身,这里暂时理解为:用于生成参数,方便传参。
将一个 Applicative 的 Traversable 转换成一个 Traversable 类型的 Applicative
Traversable 可穿越的
对一个参数经过各个函数处理后,返回处理的结果数组,并加上
转换方式:[[fn1(v), fn2(v), fn3(v)], fn()(v)] => R.sequence(fn, [fn1, fn2, fn3])(v)


const add = (n) => (x) => R.add(x, n)
let r3 = R.sequence(R.always(R.identity), [add(1), add(2), add(3)]);   //=> Just([1, 2, 3])
console.log(r3([1])) // [2,3,4,1]
const sequence = R.curry((fisrtFn, aryFn, v) => {return R.concat(R.map(f => f(v), aryFn), fisrtFn()(v))
})
let r4 = sequence(R.always(R.identity), [add(1), add(2), add(3)])
console.log(r4([1])) // [2,3,4,1]

多个参数的第一个参数相同则可以简写。fn2必须是R.map函数,参数必须是数组

// R.sequence(fn, fn2(ary)) => fn2 => R.map(n => v => { //...coding } )
// 多对一调用合并,并保留一这个参数
const Just = R.map(n => v => R.add(n, v))
let r5 = R.sequence(R.always(R.identity), Just([1, 2, 3])); //=> [Just(1), Just(2), Just(3)]
console.log(r5([1])) // [2,3,4,1]

不传参数的情况下,直接执行fn主函数并返回。

const Nothing = () => () => R.always()
let r6 = R.sequence(R.always(R.identity), Nothing());      //=> [Nothing()]
console.log(r6(123)) // [[]]

R.chain

如果第二个参数是函数,chain(f, g)(x) 等价于 f(g(x), x)
转换方式:f(g(x), x) => chain(f, g)(x)

// 分两种情况
// eg.1 每个函数调用一次,生成数组元素对应的数据.
// 区别于R.juxt(返回数据是数组),R.chain可以返回函数。
R.chain(at, modalKeys) // => [atModalKeys[0], atModalKeys[1]] 生成两个函数
// eg.2 每个函数调用一次,改变原来的数据
R.chain(R.append, R.head)([1, 2, 3]); //=> [1, 2, 3, 1]

R.converge

多个分支,将子分支的调用结果作为参数传入一个函数调用
被称为聚合再聚合

// converge
R.converge(R.equals,[R.length, R.pipe(R.intersection(v), R.length)]
)(ary)

R.compose&R.pipe

经常使用就不贴例子了,为了阐明作用,这里主要说明如下:

  1. R.compose转换方式 => fn1(fn2(fn3(params))) => R.compose(fn1, fn2, fn3)(params) 跟平时写法顺序一致。写法转换使用compose
  2. R.pipe转换方式 => fn1(fn2(fn3(params))) => R.compose(fn3, fn2, fn1)(params) 跟数据流向思路一致。强调数据流向使用pipe;另外如果参数是通过函数生成的,会使用到R.apply(R.pipe, fns)的写法。

R.composeWith&R.pipeWith

该Api主要是多了一个每调用一次函数后将结果进行处理的过程,比如参数防空验证
先执行第一个函数,第二个函数才开始进行with调用
注意:传参是函数数组

const handleFn = (fn, res) => {console.log('验证参数')return R.isNil(res) ? res : fn(res)
}
const composeWhileNotNil = R.composeWith(handleFn);
// let r = composeWhileNotNil([R.inc, R.prop('age')])({age: 1}) //=> 2
// let r2 = composeWhileNotNil([R.inc, R.prop('age')])({}) //=> undefined
// console.log(r, r2)const fn = v => {console.log('v', v)return v
}
let r3 = composeWhileNotNil([// R.inc,fn,R.prop('age'),fn,
])({age: 1}) //=> undefined
console.log(r3)
/* v { age: 1 }验证参数验证参数v 11
*/

js-ramda-流相关函数相关推荐

  1. js事件流的三个阶段

    2019独角兽企业重金招聘Python工程师标准>>> js事件流分为三个阶段: 1.事件捕获:当某个元素出发某个事件,顶层对象document就会发出一个事件流, 随着DOM树的节 ...

  2. js事件流、事件代理等

    菜菜的自己发现真的啥都不太懂 - 虽然啥都会一点,但是却什么都不精通. 偶然看见js事件流和事件代理等 - 黑人问号脸,虽然在实际写代码的时候经常用到. 做个总结: 都是学的别人的. 事件代理:通过将 ...

  3. 流线动态图python_Node.js Stream(流)

    Node.js Stream(流) Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如,对http 服务器发起请求的request 对象就是一个 Stream,还有stdout( ...

  4. Node.js: 认识流stream

    流是Node.js中一个非常重要的概念, 也是Node.js之所以适用于I/O密集型场景的重要原因之一. 流是Node.js移动数据的方式,流可以是可读的和/或可写的.在Node.js中很多模块都使用 ...

  5. java文件边读边写_[Java教程]node.js 利用流实现读写同步,边读边写

    [Java教程]node.js 利用流实现读写同步,边读边写 0 2017-09-10 13:00:14 //10个数 10个字节,每次读4b,写1blet fs=require("fs&q ...

  6. js文件流,导出txt

    js文件流,导出txt var content = "file content!"; var data = new Blob([content],{type:"text/ ...

  7. Node.js Stream(流) 简单易懂全解析

    一.node.js中的流是什么 stream(流)是Node.js提供的又一个仅在服务区端可用的模块,流是一种抽象的数据结构.Stream 是一个抽象接口,Node 中有很多对象实现了这个接口.例如, ...

  8. JS事件流和事件委托

    在上一篇<JS知识点大杂烩>中说到了事件流但没有详细的介绍,这篇文章就来介绍一下事件流. 事件流一共由三个阶段分别是: 1.捕获阶段 2.目标阶段 3.冒泡阶段 复制代码 事件绑定大家都知 ...

  9. JS事件流(事件冒泡 事件委托)

    DOM事件流 事件流描述的是从页面中接受事件的顺序 事件发生时会在元素节点之间按照特定的顺序传播,这个传播过程即DOM事件流 分为三个阶段: 捕获阶段(从上往下,从外往内) 目标阶段 冒泡阶段(从下往 ...

  10. 原生js瀑布流效果,css+html+js,复制下来可直接使用

    html里面总共需要引入三个文件 css文件两个,js代码一个 :::json文件里面的图片就自己增改把 html页面 <div class="container" id=& ...

最新文章

  1. Spring Cloud Alibaba 极速运维:微服务与 DevOps
  2. _INTSIZEOF(n)解析
  3. linux c 文件描述符 得到 文件名
  4. Saltstack grains组件
  5. android webview参数,Android webView解析URL参数
  6. 对MariaDB10.0的Sphinx进行扩展
  7. leetcode 140. 单词拆分 II(记忆化)
  8. asp.net使用post方式action到另一个页面,在另一个页面接受form表单的值!(报错,已解决!)...
  9. 【转】SharePoint Content Database简介
  10. 《深入理解分布式事务》第三章 Spring 事务的实现原理
  11. linux libstdc 怎样升级,linux 更新libstdc++.so.6
  12. 35岁程序员的独家面试经历
  13. 拿走不谢:一份历经线上考验的大规模系统的消息队列技术方案!
  14. Mysql导出数据 (windows Linux)
  15. c 语言赋值运算符,C/C+编程笔记:运算符—所有编程语言的基础!一文带你搞懂它...
  16. DM860步进电机接线及拨码
  17. yuv422转rgb565
  18. 从BIO到NIO的网络通信
  19. 全新视角!带你一文读懂ChatGPT!
  20. 如何在线引入 阿里巴巴矢量图标库?

热门文章

  1. q7goodies事例_J7Goodies ?? Windows 7 Java方式
  2. Discontinuous Galerkin method for steady transport problem
  3. Java通用判断对象是否相等方法
  4. 【解决方案!!】Ubuntu 18.04 鼠标+键盘突然失效
  5. SmartTools
  6. 自然语言处理课程学习总结
  7. 【VCSA 8】安装vCenter Server Appliance(VCSA) 8.0
  8. 弄懂了采矿业与碳中和的逻辑,就读懂了矿区无人驾驶的千亿市场
  9. 在最大中求最小系列问题(二分)
  10. 水深6到9米有鱼吗_【钓鱼技巧】秋季野钓是钓深水,还是浅水好?三招选择野钓的水深|野钓|浅水|浅水区|作钓...