使函数更通用以同时处理 sting[] 和 string
Make a function more generic to work on both sting[] and string
下面是一个示例代码,它对数组中的每个字符串执行 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' ]
您如何使这个函数在功能上更通用,以便它可以处理字符串数组以及传递给它的简单字符串值?现在这只适用于字符串数组,不适用于字符串。
从哲学上讲,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);
}());
下面是一个示例代码,它对数组中的每个字符串执行 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' ]
您如何使这个函数在功能上更通用,以便它可以处理字符串数组以及传递给它的简单字符串值?现在这只适用于字符串数组,不适用于字符串。
从哲学上讲,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);
}());