J'essaie de fusionner le vecteur des cartes.
J'ai essayé de le faire à l'aide de la méthode Code> Réduire Code> mais que vous ne pouvez pas récupérer le résultat attendu. P>
(defn merge-styles [& args] (let [max-count (apply max (map #(count %1) args)) items (map #(take max-count (concat %1 (repeat nil))) args)] (apply map merge items)))
3 Réponses :
Edit em>: Comme toujours, cela a déjà été répondu auparavant: Utilisation de" carte "avec des collections de tailles différentes dans le clojure p> (carte dans [{: a 1} {: c 3}] (Concat [{: B 2}] (répéter nil))) code>
rendements
({: A 1,: B 2} {: C 3}) Code>. P>
mappe code> se lit à la fois des vecteurs et applique les index respectifs à
dans code>, fusionnant les cartes de chaque index. Comme
mappe code> s'arrête lorsque l'une des collections est épuisée, nous devons concates
nil code> à la collection plus courte. P>
Généralement, vous pouvez simplement utiliser Vous pouvez créer une fonction comme ci-dessous pour "étendre" les collections pour avoir la même longueur, puis fusionner comme d'habitude: p> Notez que dans votre exemple, vous avez utilisé une parenthèse autour de la mappe code> et
fusionner code> pour fusionner des collections de hashmaps, mais il finira de la fusion lorsque l'une des collections est épuisée.
DATA CODE>, mais à Clojure, cela signifie que vous souhaitez l'appeler comme si c'était une fonction. Dans l'exemple ci-dessus, je l'ai changé à un
[ code> et
] code> à la place. Notez également que cette fonction dépend du fait que vous pouvez réellement
compter code> les collections que vous y transmettez (dans le clojure, vous pouvez avoir " les collections infinies em>", telles que < code> (plage) code>). p> p>
Je le briserais dans plusieurs étapes simples, comme:
(ns tst.demo.core (:use demo.core tupelo.core tupelo.test)) (def data [[{:padding-top "30px"} {:padding-top "40px"} {:padding-top "50px"}] [{:margin "40px"}]]) ; be clear about the 2 sequences we are combining (def data-1 (first data)) (def data-2 (second data)) (defn do-merge [] (let [N (max (count data-1) (count data-2))] (vec (for [i (range N)] (let [map-1 (get data-1 i) map-2 (get data-2 i)] ; returns `nil` if no value present (merge map-1 map-2) ; if merge a map & nil, it's a noop ))))) (dotest (is= (do-merge) [{:padding-top "30px", :margin "40px"} {:padding-top "40px"} {:padding-top "50px"}] ) )
Veuillez ajouter le code ce que vous avez essayé à la question et comment il a échoué afin que nous puissions l'améliorer.
Mes excuses. J'ai mis à jour le code que j'essayais d'écrire.