2
votes

ramda js concat la valeur en utilisant la réduction

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?


0 commentaires

3 Réponses :


0
votes

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);


0 commentaires

1
votes

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?


0 commentaires

2
votes

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))


0 commentaires