了解Ramda中传感器的使用

时间:2017-04-27 09:24:46

标签: 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))

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

然而,使用换能器形式我得到一个空数组。如果我删除R.filterR.map(因此只有一个操作在管道中),我得到的结果是只有管道中的那个项目。但是,我似乎无法将这两种操作结合​​起来。

我在这里缺少什么?

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

1 个答案:

答案 0 :(得分:4)

正如this article所述:

  

我们需要从pipe =>更改因为性质而构成   换能器。虽然传感器可以直接组成,但是   转换的执行是相反的。这意味着你任何时候   将R.pipe用于数组,你可以使用R.compose作为传感器,   反之亦然。

These articles are也非常有用。还有一个非常酷的工具来检查东西:ramda-debug

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

Ramda REPL

中的示例