J'ai un tableau de données qui sera converti en une chaîne. J'ai créé la fonction pour faire la conversion. Ma question est quelle est la meilleure façon d'écrire cette fonction pour la rendre plus lisible? Je ne veux pas avoir plusieurs instructions if / else
.
const data = [ "hello", {name: "Bob"}, "and", {name: "Fred"}, "How are you guys today?", ] const isString = R.is(String) const isObject = R.is(Object) const getName = R.prop('name') const toPureString = R.reduce( (result, value) => { if (isString(value)) { return `${result}${value} ` } if (isObject(value)) { return `${result}${getName(value)}` } return result }, "") toPureString(data) // hello Bob and Fred How are you guys today?
3 Réponses :
Ramda a une fonction ifElse
. Cependant, cela devient maladroit lorsque vous avez plusieurs branches à votre instruction if
:
const toPureString = R.reduce((result, value) => { const str = isObject(value) ? getName(value) : (isString(value) ? value : '') return `${result}${str}` }, '')
Dans ce cas, je le ferais avec une instruction ternaire en JavaScript simple: p>
const ifStr = R.ifElse(isString, v => `{result}{v}`, () => result); return R.ifElse(isObject, v => `{result}{getName(v)}`, ifStr);
Vous pouvez utiliser R.cond
:
<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
const { flip, is, unapply, join, useWith, prop, T, identity } = R const isString = flip(is(String)) const isObject = flip(is(Object)) const spacer = unapply(join(' ')) const getName = useWith(spacer, [identity, prop('name')]) const toPureString = R.reduce(R.cond([ [isString, spacer], [isObject, getName], [T, identity] ]), '') const data = [ "hello", {name: "Bob"}, "and", {name: "Fred"}, "How are you guys today?", ] const result = toPureString(data) console.log(result) // hello Bob and Fred How are you guys today?
Je ferais simplement quelque chose comme ceci:
const transform = pipe( map(unless(is(String), prop('name'))), join(' '), )
<script src="//cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>
sauf si
est un simplifié if-else
, qui renvoie la valeur d'origine à moins que le prédicat ne retourne true, auquel cas il applique d'abord la fonction de transformation. ( quand
est similaire, sauf qu'il applique la transformation lorsque le prédicat est vrai.) Donc, cela se déroule en deux étapes, tout d'abord en convertissant tout dans un format cohérent, des chaînes simples, puis en les combinant.
Cela pourrait mieux vous lire, mais ils sont entièrement équivalents:
const {compose, join, map, unless, is, prop} = R const data = ['hello', {name: 'Bob'}, 'and', {name: 'Fred'}, 'How are you guys today?'] const transform = compose(join(' '), map(unless(is(String), prop('name')))) console.log(transform(data))