ramda了解一下?

612 阅读4分钟

R.propSatisfies

返回布尔值

如果指定的对象属性满足 predicate,返回 true;否则返回 false。可以使用 R.where 进行多个属性的判断。

R.propSatisfies(x => x > 0, 'x', {x: 1, y: 2}); //=> true

R.where Object -> Boolean

接受一个测试规范对象和一个待检测对象,如果测试满足规范,则返回 true,否则返回 false。测试规范对象的每个属性值都必须是 predicate 。每个 predicate 作用于待检测对象对应的属性值,如果所有 predicate 都返回 true,则 where 返回 true,否则返回 false 。where 非常适合于需要声明式表示约束的函数,比如 filter 和 find

// pred :: Object -> Boolean
const pred = R.where({
  a: R.equals('foo'),
  b: R.complement(R.equals('bar')),
  x: R.gt(R.__, 10),
  y: R.lt(R.__, 20)
});

pred({a: 'foo', b: 'xxx', x: 11, y: 19}); //=> true
pred({a: 'xxx', b: 'xxx', x: 11, y: 19}); //=> false
pred({a: 'foo', b: 'bar', x: 11, y: 19}); //=> false
pred({a: 'foo', b: 'xxx', x: 10, y: 19}); //=> false
pred({a: 'foo', b: 'xxx', x: 11, y: 20}); //=> false

R.when

const truncate = R.when(
  R.propSatisfies(R.gt(R.__, 10), 'length'),
  R.pipe(R.take(10), R.append('…'), R.join(''))
);
truncate('12345');         //=> '12345'
truncate('0123456789ABC'); //=> '0123456789…'

R.unless

判断是否满足第一个条件,满足原样返回。不满足执行第二个参数函数

let safeInc = R.unless(R.isNil, R.inc);
safeInc(null); //=> null
safeInc(1); //=> 2

R.ifElse

案例1

接口调用并处理

 async onLineNum(id){
      let onLineNumData = await service.onLineNum(id)
      const onLineMiddle=R.ifElse(
        R.equals(200),
        () => this.onLineNumData = R.slice(0,3)(onLineNum.data),
        R.F
)
onLineMiddle(R.prop('code')(onLineNumData))

案例2

const printFn = R.ifElse(
          R.equals('development'),
          ()=>{return this.consoleFn()},
          ()=>{R.F}
)
printFn('development')

R.cond

注意and的两个参数都为对象时,只会走第一个分支

错误用法

   const isAndroidOrIos = R.cond([
        [R.and({}),   ()=>{alert(1)}],
        [R.and({}), ()=>{alert(2)}],
        [R.T,()=>console.warn('no ios and android!')]
    ]);
    isAndroidOrIos({})
    isAndroidOrIos({})

正确用法

 const Typefn = R.cond([
          [R.equals('1'), () =>last = 1],
          [R.equals('2'), () =>last = 2],
          [R.equals('3'),  () =>last = 3],
          [R.T,           () =>last = 4]
  ]);
Typefn(3); 

正确用法2

  var Fn1 = R.cond([
        [R.equals(0),  ()=>alert(0)],
        [R.equals(1), ()=>alert(1) ],
        [R.equals(2), ()=>alert(2) ],
        [R.T,   R.F]
      ]);
     Fn1(0)

正确用法3 传参版本

R.cond 条件回调的第二个参数必须是一个可执行的函数。如果是箭头函数中嵌套函数,里面的函数需要调用一下。

function fnn0(x){alert(x)}
function fnn1(){alert(1)}
function fnn2(){alert(2)}
var Fn1 = R.cond([
        [R.equals(0), ()=>fnn0(0)],
        [R.equals(1), ()=>fnn1() ],
        [R.equals(2), fnn2 ],
        [R.T,   R.F]
]);
Fn1(0)

其他逻辑运算函数

  • R.and
  • R.T
  • R.F
  • R.both
  • R.propEq
  • R.equals
  • R.and

总结

  1. 没有if elseif else
  2. cond使用必须是明确的条件,否则只会执行第一个分支

其他

R.pipe

function fnn0(){alert(0)}
function fnn1(){alert(1)}
function fnn2(){alert(2)}
var fn = R.pipe(fnn0,fnn1,fnn2)()

safari 下被转义字符串的处理

var str = JSON.stringify({'OD':'aaaa'});
//"{\"OD\":\"aaaa\"}"

JSON.stringify

 JSON.stringify(obj, fn|arr);

1)当第二个参数为数组时,表示需要被序列化的对象的属性列表;

2)当第二个参数为方法时,function(key,value){}表示每个属性对应的key-value值,最终的返回值可以用来改变原来的结果。

该方法可以用来在序列化之前改变对象的内容。

可以接受第三个参数,这个可以用来按格式打印对象

JSON.stringify(obj,null,number|string)

console.log(JSON.stringify({a:{b:1}},null,2))
{
  "a": {
    "b": 1
  }
}

1)当第三个参数为数值时,表示每个属性前的空格数(<10)

当第三个参数为字符串时,表示在每个属性前添加该字符串(<10)

console.log(JSON.stringify({a:{b:1}},null,"==="))
{
==="a": {
======"b": 1
===}
}

其他案例

function replacer(key, value) {
   console.log(value,typeof value)
  //return value.replace(/[^\w\s]/gi, '');
}

var foo = {"a":"1","b":"2"};
var jsonString = JSON.stringify(foo, replacer);

// {a: "1", b: "2"}  "object"

当我在JavaScript中的复杂对象上调用JSON.stringify()时,它会生成一个带有很多转义序列(\“,\”等)的字符串。

如何使它创建人类可读的JSON字符串呢?即,您可以将其复制/粘贴到网络上许多JSON验证器之一中吗?

为了明确起见,我的首要考虑是删除转义序列。 您可以使用替换器。JSON.stringify.Replacer提供的第二个参数可以是函数或数组。

在您的情况下,我们可以创建一个将所有特殊字符替换为空格的函数。以下示例替换了空格和下划线。


function replacer(key, value) {
  return value.replace(/[^\w\s]/gi, '');
}

var foo = {"a":"1","b":2};
var jsonString = JSON.stringify(foo, replacer);

var o = {a: {b: 1}};

function f(key, value) {
  console.log("["+ key +"]:" + value);
  return value;
}

JSON.stringify(o, f)

打印结果



R.isNil

只判断是不是 null 、 undefined 只有传入null 、 undefined时返回true


R.isNil(undefined)
true
R.isNil(null)
true
R.isNil(0)
false
R.isNil(1)
false
R.isNil('')
false
R.isNil(true)
false
R.isNil(false)
false

R.or 逻辑或运算


R.or(true, true); //=> true
R.or(true, false); //=> true
R.or(false, true); //=> true
R.or(false, false); //=> false

R.either 逻辑或运算

返回由 || 运算符连接的两个函数的包装函数。如果两个函数中任一函数的执行结果为 truth-y,则返回其执行结果。 注意,这个是短路表达式,意味着如果第一个函数返回 truth-y 值的话,第二个函数将不会执行。


const gt10 = x => x > 10;
const even = x => x % 2 === 0;
const f = R.either(gt10, even);
f(101); //=> true
f(8); //=> true

R.empty()

根据传入参数的类型返回其对应的空值


R.or(true, true); //=> true
R.or(true, false); //=> true
R.or(false, true); //=> true
R.or(false, false); //=> false

R.unless()

判断输入值是否满足 predicate,若不符合,则将输入值传给 whenFalseFn 处理,并将处理结果作为返回;若符合,则将输入值原样返回。返回其对应的空值

let safeInc = R.unless(R.isNil, R.inc);
safeInc(null); //=> null
safeInc(1); //=> 2