2017-04-27 68 views
1

考虑下面的代码:了解使用传感器的Ramda

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(因此只有一个操作在管道中),我得到了在管道中只有该项目的预期结果。但是,我似乎并不能将这两种操作结合​​起来。

我在这里错过了什么?

A码笔与该代码可用:http://codepen.io/rodeoclash/pen/EWJmMZ?editors=1112

回答

3

this article指出:

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

Thesearticlesare也非常有用。还有非常酷的工具来检查东西:ramda-debug

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

Ramda REPL中的示例。

+0

因此,使用传感器似乎反转了提供给它的功能的顺序? 我的期望是在传感器上使用'R.pipe'将会按照与使用不带传感器的'R.pipe'相同的顺序进行操作。 – Samuel

+0

是的,用几个有用的链接更新了我的答案。 – devor

+0

太好了,非常感谢! – Samuel