2016-07-17 13 views
1

Hier ist ein Beispielcode, der zwei Operationen auf jeder Saite aus einem Array führt:Machen Sie eine Funktion allgemeinere sowohl Stachel zu arbeiten [] und String

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' ] 

Wie würden Sie diese Funktion allgemeineren noch machen in ein funktioneller Weg, so dass es auf Array-String funktioniert, sowie einfache String-Werte passe daran? Im Moment funktioniert das nur für Arrays von Strings, nicht für Strings.

Antwort

1

Ramda selbst, philosophisch, würde keine Funktion wie diese erstellen, immer einfache Funktionen bevorzugen, die eine einzige Sache tun.

Aber es ist nicht schwer, einen eigenen zu schreiben. Hier ist eine Lösung, mit Ramda der cond Funktion:

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' 

aktualisieren:

Dies würde wahrscheinlich einfacher sein, mit 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

Dank, Ihre Antworten sind immer willkommen. Also im Falle von Ramda Weg der Dinge, würden Sie 2 separate einfache Funktionen bevorzugen, eine für Array, eine für Strings? –

+0

In Ramda selbst, ja, und das ist meine eigene persönliche Philosophie. Aber natürlich ist es deine Wahl für deinen eigenen Code. –

+1

Hinzugefügt einfachere Version basierend auf 'ifElse' statt' cond'. –