2017-05-05 2 views
0

J'ai besoin de corriger les propriétés d'un objet dans ramda.js. Je voudrais ne pas utiliser de lentilles.Ajouter et renommer la propriété conditionnellement dans Ramda sans utiliser de lentille

Avoir les données suivantes j'ai besoin:

Si des objets dans les propriétés du tableau dans a et b un autres

  • ne pas la propriété « animationTimingFunction » ajouter la clé de la propriété « assouplissement » avec la valeur ease

  • La propriété "animationTimingFunction" renomme cette propriété en "assouplissant" et conserve la valeur telle qu'elle est.

Données d'entrée:

let data = { 
    "a": [{ 
     "opacity": "1", 
     "offset": "0" 
    }, { 
     "opacity": "0", 
     "offset": "0.25", 
     "animationTimingFunction": "linear" 
    }, { 
     "opacity": "1", 
     "offset": "0.5" 
    }, 
    "b": [{ 
     "transform": "scale3d(1, 1, 1)", 
     "offset": "0" 
    }, { 
     "transform": "scale3d(1.05, 1.05, 1.05)", 
     "offset": "0.5" 
    }, { 
     "transform": "scale3d(1, 1, 1)", 
     "offset": "1" 
    }] 
}; 

sortie doit être:

let data = { 
    "a": [{ 
     "opacity": "1", 
     "offset": "0", 
     "easing": "ease" 
    }, { 
     "opacity": "0", 
     "offset": "0.25", 
     "easing": "linear" 
    }, { 
     "opacity": "1", 
     "offset": "0.5", 
     "easing": "ease" 
    }, 
    "b": [{ 
     "transform": "scale3d(1, 1, 1)", 
     "offset": "0", 
     "easing": "ease" 
    }, { 
     "transform": "scale3d(1.05, 1.05, 1.05)", 
     "offset": "0.5", 
     "easing": "ease" 
    }, { 
     "transform": "scale3d(1, 1, 1)", 
     "offset": "1", 
     "easing": "ease" 
    }] 
}; 

Pour commencer, j'ai essayé, mais je manque la partie condition:

let convertEasing = (data) =>{ 
     let convert = data => R.assoc('easing', 'linear'); 
     let result = R.map(R.map(convert(data)), data) 
     return result; 
    }; 

Répondre

1

Que diriez-vous juste

const alter = obj => { 
    const ease = prop('animationTimingFunction', obj) || 'ease'; 
    return dissoc('animationTimingFunction', assoc('easing', ease, obj)); 
} 

map(map(alter))(data); 

Vous pouvez le faire sans les points si vous choisissez:

const alter = pipe(
    chain(
    assoc('easing'), 
    pipe(prop('animationTimingFunction'), defaultTo('ease')), 
), 
    dissoc('animationTimingFunction') 
) 

Mais à mon esprit qui perd en lisibilité. Vous pouvez voir eitherversion sur le Ramda REPL.

+0

Merci Scott, j'ai essayé d'utiliser R.cond mais votre version est beaucoup plus claire. – GibboK