原文链接: ramda 函数 logic

上一篇: ramda 函数 String

下一篇: Functor(函子)、Monad(单子)、Applicative

逻辑操作

const R = require('ramda')
console.log('and 逻辑与')
R.and(true, true); //=> true
R.and(true, false); //=> false
R.and(false, true); //=> false
R.and(false, false); //=> falseconsole.log('or 逻辑或')
R.or(true, true); //=> true
R.or(true, false); //=> true
R.or(false, true); //=> true
R.or(false, false); //=> falseconsole.log('not 逻辑非')
// 逻辑非运算。 当传入参数为 false-y 值时,返回 true;truth-y 值时,返回 false。
R.not(true); //=> false
R.not(false); //=> true
R.not(0); //=> true
R.not(1); //=> falseconsole.log('allPass 多条件and')
// 传入包含多个 predicate 的列表,返回一个 predicate:如果给定的参数满足列表中的所有 predicate ,则返回 true。
// 该函数返回一个柯里化的函数,参数个数由列表中参数最多的 predicate 决定。
const isQueen = R.propEq('rank', 'Q');
const isSpade = R.propEq('suit', 'S');
const isQueenOfSpades = R.allPass([isQueen, isSpade]);
console.log(isQueenOfSpades({rank: 'Q', suit: ' '}), //=> falseisQueenOfSpades({rank: 'Q', suit: 'S'}), //=> true
)console.log('anyPass 多条件or')
// 传入包含多个 predicate 的列表,返回一个 predicate:只要给定的参数满足列表中的一个 predicate ,就返回 true。
// 该函数返回一个柯里化的函数,参数个数由列表中参数最多的 predicate 决定。
const isClub = R.propEq('suit', 'C');
const isBlackCard = R.anyPass([isClub, isSpade]);
console.log(isBlackCard({rank: '10', suit: 'C'}), //=> trueisBlackCard({rank: 'Q', suit: 'S'}), //=> trueisBlackCard({rank: 'Q', suit: 'B'}), //=> false
)console.log('both 短路and')
// 该函数调用两个函数,并对两函数返回值进行与操作。若第一个函数结果为 false-y 值 (false, null, 0 等),则返回该结果,否则返回第二个函数的结果。注意,both 为短路操作,即如果第一个函数返回 false-y 值,则不会调用第二个函数。
const gt10 = R.gt(R.__, 10)
const lt20 = R.lt(R.__, 20)
const f = R.both(gt10, lt20);
console.log(f(15), //=> truef(30), //=> false// R.both(Maybe.Just(false), Maybe.Just(55)), // => Maybe.Just(false)R.both([false, false, 'a'], [11]), //=> [false, false, 11]R.both([true, false], [false]), //=> [false, false]R.both([true, false], [true]), //=> [true, false]R.both([], [11]), //=> []// R.both(false, [11]), //=>  报错 fn is not a functionR.both(R.F, [11])(), //=> falseR.both(() => false, () => "abc")(), //=> falseR.both(() => true, () => false)(), //=> false)console.log('either 短路或')
// 返回由 || 运算符连接的两个函数的包装函数。如果两个函数中任一函数的执行结果为 truth-y,则返回其执行结果。 注意,这个是短路表达式,
// 意味着如果第一个函数返回 truth-y 值的话,第二个函数将不会执行。
const gt11 = x => x > 11
const even = x => x % 2 === 0;
const ff = R.either(gt10, even);
console.log(ff(101), //=> trueff(8), //=> true
)// R.either(Maybe.Just(false), Maybe.Just(55)); // => Maybe.Just(55)
console.log(R.either([false, false, 'a'], [11]), // => [11, 11, "a"]R.either([true, false, true], [null]), // => [ true, null, true ]
)console.log('complement 取反')
// 对函数的返回值取反。接受一个函数 f,返回一个新函数 g:在输入参数相同的情况下,若 f 返回 'true-y' ,则 g 返回 false-y ,反之亦然。
const isNotNil = R.complement(R.isNil);
console.log(R.isNil(null), //=> trueisNotNil(null), //=> falseR.isNil(7), //=> falseisNotNil(7), //=> true
)console.log('cond 条件选择')
// 返回一个封装了 if / else,if / else, ... 逻辑的函数 fn。
// R.cond 接受列表元素为 [predicate,transformer] 的列表。
// fn 的所有参数顺次作用于每个 predicate,直到有一个返回 "truthy" 值,
// 此时相应 transformer 对参数处理,并作为 fn 的结果返回。
// 如果没有 predicate 匹配,则 fn 返回 undefined。
const fn = R.cond([[R.equals(0), R.always('water freezes at 0°C')],[R.equals(100), R.always('water boils at 100°C')],// R.T 恒定返回 true 的函数。忽略所有的输入参数。[R.T, temp => 'nothing special happens at ' + temp + '°C']
]);
console.log(fn(0), //=> 'water freezes at 0°C'fn(50), //=> 'nothing special happens at 50°C'fn(100), //=> 'water boils at 100°C'
)console.log('defaultTo 默认值')
// 如果第二个参数不是 null、undefined 或 NaN,
// 则返回第二个参数,否则返回第一个参数(默认值)。
const defaultTo42 = R.defaultTo(42);defaultTo42(null);  //=> 42
defaultTo42(undefined);  //=> 42
defaultTo42(false);  //=> false
defaultTo42('Ramda');  //=> 'Ramda'
// parseInt('string') results in NaN
defaultTo42(parseInt('string')); //=> 42console.log('ifElse if-else包装')
// 根据 condition predicate 的返回值调用 onTrue 或 onFalse 函数。
const incCount = R.ifElse(R.has('count'),R.over(R.lensProp('count'), R.inc),R.assoc('count', 1)
);
incCount({});           //=> { count: 1 }
incCount({count: 1}); //=> { count: 2 }console.log('isEmpty 空值检测')
// 检测给定值是否为其所属类型的空值,若是则返回 true ;否则返回 false 。
R.isEmpty([1, 2, 3]);   //=> false
R.isEmpty([]);          //=> true
R.isEmpty('');          //=> true
R.isEmpty(null);        //=> false
R.isEmpty({});          //=> true
R.isEmpty({length: 0}); //=> falseconsole.log('pathSatisfies 路径检测')
// 如果对象的给定路径上的属性满足 predicate,返回 ture;否则返回 false。
console.log(R.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: 2}}), //=> trueR.pathSatisfies(y => y > 0, ['x', 'y'], {x: {y: -2}}), //=> false// [] 表示根, 即传入的数据R.pathSatisfies(R.is(Object), [], {x: {y: 2}}), //=> true
)// 如果指定的对象属性满足 predicate,返回 true;否则返回 false。可以使用 R.where 进行多个属性的判断。
console.log('propSatisfies 属性条件检测')
const gtZero = x => {console.log('gtZero', x)return x > 0
}
console.log(R.propSatisfies(gtZero, 'x', {x: 1, y: 2}), //=>  gtZero 1 trueR.propSatisfies(gtZero, '', {x: 1, y: 2}), //=>  gtZero undefined falseR.propSatisfies(gtZero, 'xyz.abc', {x: 1, y: 2}), //=>  gtZero undefined falseR.propSatisfies(R.isNil, 'xyz', {x: 1, y: 2}), //=> true
)// 判断输入值是否满足 predicate,
// 若不符合,则将输入值传给 whenFalseFn 处理,并将处理结果作为返回;
// 若符合,则将输入值原样返回。
console.log('unless 和when相反')
let safeInc = R.unless(R.isNil, R.inc);
safeInc(null); //=> null
safeInc(1); //=> 2// 接受一个 predicate ,transform function 和 初始值,返回一个与初始值相同类型的值。
// 对输入值进行 transform ,直到 transform 的结果满足 predicate,
// 此时返回这个满足 predicate 的值。
console.log('until 对while的包装')
R.until(R.gt(R.__, 100), R.multiply(2))(1) // => 128// 判断输入值是否满足 predicate,
// 若符合,则将输入值传给 whenTrueFn 处理,并将处理结果作为返回;
// 若不符合,则将输入值原样返回。
// truncate :: String -> String
console.log('when 和unless相反')
let safeDec = R.when(R.isNil, R.dec);
console.log(safeDec(null), //=> -1safeDec(1), //=> 1R.dec(null), // -1R.dec(false) // -1
)

ramda 函数 logic相关推荐

  1. [转载] numpy教程:逻辑函数Logic functions

    参考链接: Python中的numpy.isfortran http://blog.csdn.net/pipisorry/article/details/48208433 真值测试Truth valu ...

  2. [Ramda] Complement: Logic opposite function

    Take a function as arguement, and the function only return true of false. If the function 'f' return ...

  3. 翻译连载 | 附录 C:函数式编程函数库-《JavaScript轻量级函数式编程》 |《你不知道的JS》姊妹篇...

    为什么80%的码农都做不了架构师?>>>    原文地址:Functional-Light-JS 原文作者:Kyle Simpson-<You-Dont-Know-JS> ...

  4. 函数式javascript_JavaScript第二部分中的函数式编程

    函数式javascript In the first installment of this series, we discussed the foundations of functional pr ...

  5. 2018 年你需要知道的 11 个 JavaScript 库

    译者按:你可能已经用到Underscore或者Lodash.本文列举了11个常用的库来提高开发效率. 为了保证可读性,本文采用意译而非直译.另外,本文版权归原作者所有,翻译仅用于学习. JavaScr ...

  6. unity3d Android多渠道,Unity For Android多渠道SDK接入解决方案

    SDK一般分为以下几个(常用的)函数 Login()sdk初始化函数 Logic()SDK登陆函数 LogOut() sdk登出函数 Pay()支付 GameCenter()社区 总体框架: ---- ...

  7. 函数式编程 模式_函数式编程模式:食谱

    函数式编程 模式 This article targets an audience that's graduating from functional libraries like ramda to ...

  8. 【读书笔记《Android游戏编程之从零开始》】11.游戏开发基础(SurfaceView 游戏框架、View 和 SurfaceView 的区别)...

    1. SurfaceView 游戏框架实例 实例效果:就是屏幕上的文本跟着点击的地方移动,效果图如下: 步骤: 新建项目"GameSurfaceView",首先自定义一个类&quo ...

  9. 电路中的中英文词汇对照

    电路的基本概念及定律 电源 source 电压源 voltage source 电流源 current source 理想电压源 ideal voltage source 理想电流源 ideal cu ...

  10. 函数式编程中的组合子

    函数式编程是一个比较大的话题,里面的知识体系非常的丰富,在这里我并不想讲的特别的详细.为了应对实际中的应用,我们讲一下函数式编程中最为实用的应用方式--组合子.组合子本身是一种高阶函数,他的特点就是将 ...

最新文章

  1. 网站优化之交换友情链接应注意什么?
  2. mysql保存数据提示:Out of range value for column错误
  3. python list超出范围_使用lxmldjango/python-list索引超出范围
  4. (建议收藏)万字长文,帮你一招搞定产品经理面试-详解产品经理面试大全
  5. boost::math::tools::continued_fraction_b用法的测试程序
  6. LUN/PV/VG/LV
  7. Source Insight建工程之Kernel
  8. Erstudio8.0怎么用?Erstudio8.0汉化版详细使用教程
  9. 超简单的子父组件传值
  10. Linux下解决cannot connect to X server :0.0 问题
  11. 机器视觉硬件——工业相机
  12. jaspersoft studio实践 --实现网页版打印小票(模板一)
  13. 富士莱医药深交所上市:市值61亿 净利1.2亿同比降15%
  14. JavaEE ssm三大框架黑马视频
  15. 【Matlab系列】matlab中数据归一化方法
  16. 程序猿 or 攻城狮
  17. mysql sql 优化 博客园_Mysql的SQL优化指北
  18. 中信国安:奇虎360私有化交割完成
  19. 工业品数字化采购发展趋势分析,采购系统赋能企业采购业务智慧升级
  20. 数据结构课后答案 c语言版

热门文章

  1. 华为养狼,喂的是真肉
  2. 北大光华女的超强面经! 感动之余,真的受益匪浅。
  3. 软件测试之黑盒测试白盒测试
  4. 使用大麦网抢票工具的一些心得体会
  5. MySQL 第六章过程式数据库对象.1存储对象
  6. 基于jsp的学生培训管理系统
  7. echarts设置标题样式_EChart 标题 title 样式,x轴、y轴坐标显示,调整图表位置等...
  8. Golang复杂json结构体解析
  9. python井字格游戏_python实现简单井字棋游戏
  10. 计算机光盘无法格式化,怎么格式化光盘啊??求解!!