2017-04-27 37 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