了解 Ramda 中转换器的使用

Sam*_*uel 3 javascript ramda.js

鉴于以下代码:

const objs = [
  {
    name: '1st',
    completed: false,
  },
  {
    name: '2nd',
    completed: true,
  },
  {
    name: '3rd',
    completed: true,
  },
]

const transducer = R.pipe(
  R.filter(R.propEq('completed', true)),
  R.map((obj) => {
    return {
      label: `${obj.name} (${obj.completed.toString()})`,
    }
  }),
)

const intoArray = R.into([])

console.log('-- working --')
console.log(transducer(objs))

console.log('-- not working --')
console.log(intoArray(transducer, objs))
Run Code Online (Sandbox Code Playgroud)

使用R.pipe表单时,我得到了预期的结果(数组中的两个对象都带有名称的标签字段和已完成的字段插入在一起)

但是,使用换能器形式,我得到一个空数组。如果我删除 theR.filter或 the R.map(所以只有一个操作在管道中),我会得到管道中只有该项目的预期结果。但是,我似乎无法将这两种操作结合​​起来。

我在这里缺少什么?

可以使用带有此代码的代码笔:http : //codepen.io/rodeoclash/pen/EWJmMZ?editors=1112

dev*_*vor 5

正如本文所指出的:

由于换能器的性质,我们需要改变管道 => 组合。尽管可以直接组合转换器,但转换的执行是相反的。这意味着任何时候您将 R.pipe 用于阵列,您将使用 R.compose 作为换能器,反之亦然。

这些 文章 也是非常有用的。还有一个很酷的检查工具:ramda-debug

const transducer = R.compose(
  R.filter(R.propEq('completed', true)),
  R.map((obj) => {
    return {
      label: `${obj.name} (${obj.completed})`,
    }
  })
)
Run Code Online (Sandbox Code Playgroud)

Ramda REPL 中的示例。