2016-07-17 22 views
1

在這裏工作是從一個數組來對每串2個操作的示例代碼:做一個功能更爲通用,以兩個刺痛[]和串

const R  = require('ramda') 
const myArray = [ 'one', 'two', 'tree', 'four', 'five' ] 

function capitalize(x) { 
    return x.toUpperCase() 
} 

function removeLastCharacter(x) { 
    return x.slice(0, -1) 
} 

let stringManipulator = R.map(R.compose(capitalize, removeLastCharacter)) 
// => [ 'ON', 'TW', 'TRE', 'FOU', 'FIV' ] 

你將如何使這一功能更通用還在一個函數式的方式,所以它將工作在字符串數組,以及簡單的字符串值傳遞給它?現在這隻適用於字符串數組,而不是字符串。

回答

1

Ramda本身,哲學,不會產生這樣的功能,總是喜歡簡單的函數,做一件事。

但它並不難寫一個你自己的。這裏有一個解決方案,使用Ramda的cond功能:

var process = (function() { 
    var fn = R.compose(R.toUpper, R.slice(0, -1)); 
    return R.cond([ 
    [R.is(Array), R.map(fn)], 
    [R.T, fn] 
    ]); 
}()); 

process(['one', 'two', 'three']); //=> ['ON', 'TW', 'THRE'] 
process('foobar'); //=> 'FOOBA' 

更新

這很可能是與ifElse簡單:

var process = (function() { 
    var fn = R.compose(R.toUpper, R.slice(0, -1)); 
    return R.ifElse(R.is(Array), R.map(fn), fn); 
}()); 
+0

謝謝,你的回答總是讚賞。所以在拉姆達方式的情況下,你更喜歡2個單獨的簡單函數,一個用於數組,一個用於字符串? –

+0

在拉姆達本身,是的,那也是我自己的個人哲學。但顯然這是你自己的代碼的選擇。 –

+1

基於'ifElse'而不是'cond'添加了更簡單的版本。 –