ramda 日常使用

https://adispring.github.io/

 

ramda对函数参数的个数要求比较严格, 虽然可以使用R.__占位符, 但是一般情况下还是尽量少用

注意, ramda主要用于数据流而非逻辑流

 

模拟数组操作, 注意普通的迭代函数并没有加入index, 在需要时, 需要自己添加

尽量使用库的遍历方式, 鬼知道神奇的各种webview有没有实现相应的方法…. (遇到过数组没有flat的…..)

const map = R.addIndex(R.map)
map((v, i) => console.log(v, i), R.range(10, 16))
// 10 0
// 11 1
// 12 2
// 13 3
// 14 4
// 15 5

 

递归求解fib

const R = require("ramda")

const fib = n => R.unless(
  R.gte(2),
  () => fib(n - 1) + fib(n - 2)
)(n)


// 0--1--2--3--5--8--13--21--34--55
console.log(
  R.map(fib, R.range(0, 10)).join("--")
);

 

条件赋值

const getCount = R.ifElse(
  R.has("count"),
  R.evolve({count: R.inc}),
  R.assoc("count", 0)
)

console.log(getCount({}))  // { count: 0 }
console.log(getCount({count: 10})) // { count: 11 }

 

带默认值的查找

const list = [
  {id: 1, name: "a"},
  {id: 2, name: "b"},
  {id: 3, name: "c"}
]
const findStu = id => R.defaultTo(
  {name: "default"},
  R.find(R.propEq("id", id), list)
)
console.log(findStu(1)) // { id: 1, name: "a" }
console.log(findStu(2)) // { id: 2, name: "b" }
console.log(findStu(3)) // { id: 3, name: "c" }
console.log(findStu(4)) // { name: "default" }

 

 

代替switch

const getGrade = R.cond([
    [R.gte(R.__, 90), R.always("优秀")],
    [R.gte(R.__, 60), R.always("及格")],
    [R.gte(R.__, 0), R.always("不及格")],
    [R.T, R.always("error")]
  ]
)

// 不及格
// 及格
// 优秀
// error
console.log(getGrade(59))
console.log(getGrade(60))
console.log(getGrade(90))
console.log(getGrade("abc"))

 

代替if-else

const gt3 = R.when(R.lte(R.__, 3), R.multiply(2))

const a = R.range(1, 6)
console.log(a)  // [ 1, 2, 3, 4, 5 ]
console.log(R.map(gt3, a)) // [ 2, 4, 6, 4, 5 ]

 

 

快排

const quickSort = R.cond(
  [
    [R.isEmpty, R.always([])],
    [
      R.T,
      xs => {
        const head = R.head(xs);
        const tail = R.tail(xs);
        return R.compose(quickSort, R.filter(R.lte(R.__, head)))(tail)
          .concat(head)
          .concat(R.compose(quickSort, R.filter(R.gte(R.__, head)))(tail));
      }]
  ]
);

// 1--3--4--5--6--7--9
console.log(
  quickSort([5, 1, 9, 4, 6, 7, 3]).join("--")
)

简化

const quickSort2 = R.unless(
  R.isEmpty,
  ([head, ...tail]) => [
    ...R.compose(quickSort, R.filter(R.lte(R.__, head)))(tail),
    head,
    ...R.compose(quickSort, R.filter(R.gte(R.__, head)))(tail),
  ]
);

// 1--3--4--5--6--7--9
console.log(
  quickSort2([5, 1, 9, 4, 6, 7, 3]).join("--")
)

 

hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » ramda 日常使用