2016-12-15 1 views
0

Un objet contient des variables liées à l'interface utilisateur.comment je peux fusionner un tableau imbriqué avec un nouvel objet avec ramda?

const data = [ 
    { color: [{ primary: "#444", secondary: "#dede", light: "#fff" }] }, 
    { size: [12,14,16,18,20] }, 
    ... 
]; 

Je veux faire cet objet un seul tableau comme:

const UI = [ 
    { colorPrimary: "#444" }, 
    { colorSecondary: "#dede" }, 
    { colorLight: "#fff" }, 
    { size0: 12 }, 
    { size1: 14 }, 
    { size2: 16 }, 
    { size3: 18 }, 
    { size4: 20 }, 
    ... 
]; 

Comment puis-je faire avec Ramda?

+0

Comment distingueriez-vous une propriété comme 'color', où vous semblez ignorer le tableau contenant les données, et une autre comme' size', où les indices de tableau deviennent partie intégrante des clés? –

Répondre

1

Je n'ai pas une manière propre à le faire avec les données fournies pour la raison exprimée dans mon commentaire:

Comment décririez-vous la distinction entre une propriété comme color, où vous semblez ignorer le tableau contenant les données, et un comme size, où les indices de tableau font partie des clés?

Mais avec juste un tweak mineur à vos données, à ceci:

const data = [ 
    { color: { primary: "#444", secondary: "#dede", light: "#fff" } }, 
    { size: [12,14,16,18,20] }, 
]; 

Il est assez simple:

const initialCap = str => toUpper(head(str)) + tail(str); 

const collectProps = pipe(
    map(map(toPairs)), 
    apply(merge), 
    mapObjIndexed((pairs, key) => map(
    pair => objOf(key + initialCap(pair[0]), pair[1]), pairs 
)), 
    values, 
    apply(concat) 
); 

collectProps(data); 

Vous pouvez le voir en action sur le Ramda REPL. Je ne sais rien de la source de vos données, donc je ne sais pas si cela est possible pour vous de gérer. Mais si vous le pouvez, cela semble fonctionner.

+0

C'est vraiment génial, merci Scott. Je peux changer l'objet d'interface utilisateur pour l'adapter. Ramda est vraiment sauveur de la vie. Je dois apprendre plus. Merci encore. – kLezer