使函数更通用以处理sting []和字符串

时间:2016-07-17 18:43:31

标签: functional-programming ramda.js

下面是一个示例代码,它对数组中的每个字符串执行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 个答案:

答案 0 :(得分: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);
}());