0
votes

RAMDA: Comment changer une seule valeur d'un objet, basé sur les autres valeurs de l'objet

Je construis une application réactive. J'utilise Ramda pour m'aider à la programmation fonctionnelle.

Si vous souhaitez voir le code complet, j'ai également demandé de l'aide sur Stackexchange Code critique . p>

Pour débordement de pile, une seule partie est pertinente, cependant. P>

Comment pouvez-vous modifier une valeur spécifique d'un objet basé sur les autres valeurs de l'objet à l'aide de RAMDA? J'utilise mapobjindexed code> qui dans le processus plante sur toutes les touches. P>

Contexte: strong> J'ai sur objet représentant un contact avec plusieurs clés qui sont toutes des cordes. L'objet a toujours une clé appelée contacdutails code>. Je veux calculer la valeur de contacdutails code> à charge des valeurs du Tel code>, BDay code> et e-mail code>. p>

Si un contact ressemble à ceci avant la fonction: p> xxx pré>

Il devrait ressembler à ceci après: p>

R.mapObjIndexed((val, key, obj) =>
  key === 'contactDetails'
    ? R.trim(
        R.replace(
          /undefined/g,
          '',
          `${R.prop('bday')(obj)} ${R.prop('tel')(obj)} ${R.prop('email')(
            obj
          )}`
        )
      )
    : val
),


0 commentaires

3 Réponses :


1
votes

Vous pouvez utiliser R.Converge pour fusionner l'objet d'origine et le résultat de R.Pipe qui génère la propriété ContactDétails code>. Le tuyau obtient une gamme de valeurs via R.Props, filtre les valeurs de fausseté (indéfinies, cordes vides, nulls, etc ...), relie les éléments avec des espaces et enveloppez la valeur avec un objet avec R.OBJOF. p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>


0 commentaires

4
votes

Sauf si c'est un exercice dans l'apprentissage de Ramda, je suggérerais qu'une technique plus simple que tout ce que tout ce que vous êtes susceptible de trouver de Ramda est l'approche directe de la déstructuration de l'objet:

p>

const combine = (ss) => ss.reduce((a, s) => a + (s.length ? ' ' : '') + s, '').trim()

const transform = ({tel, bday, email, ...rest}) => ({
  ...rest, tel, bday, email,
  contactDetails: combine([bday, email, tel])
})


1 commentaires

Merci comme toujours Scott. J'aime comment vous répondez presque toutes les questions étiquetées avec Ramda. Ça aide vraiment les gens à apprendre



2
votes

comme alternative à la réponse d'ORI, nous pouvons mettre à jour la propriété à l'aide de R.assoc ('ContactDétails') CODE>, Construction d'une liste des valeurs de propriété souhaitées à l'aide de r.juxt code > et r.propor ('') code> Pour par défaut des propriétés manquantes, rejeter toutes les chaînes vides avant de les rejoindre avec r.join code>.

p>

<script src="https://cdnjs.cloudflare.com/ajax/libs/ramda/0.26.1/ramda.js"></script>


0 commentaires