2016-07-17 7 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' ] 

Как бы вы сделать эту функцию более общий характер еще в функциональный способ, поэтому он будет работать с массивом строки, а также с простыми строковыми значениями passe? Сейчас это работает только в массиве строк, а не в строках.

ответ

1

Сама Рамда, философски, не создавала бы такую ​​функцию, всегда предпочитая простые функции, которые делают одну вещь.

Но нетрудно написать свой собственный. Вот одно решение, используя функцию cond Ramda в:

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' 

Update:

Это, вероятно, будет проще с 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

Спасибо, ваши ответы всегда ценятся. Итак, в случае с вещами Ramda, вы предпочтете две отдельные простые функции, одну для массива, одну для строк? –

+0

В самой Рамде, да, и это моя личная философия. Но, очевидно, это ваш выбор для вашего собственного кода. –

+1

Добавлена ​​более простая версия, основанная на 'ifElse', а не' cond'. –