0
votes

Clojure: Comment fusionner le vecteur des cartes sur la base de l'index?

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


2 commentaires

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.


3 Réponses :


0
votes

(carte dans [{: a 1} {: c 3}] (Concat [{: B 2}] (répéter nil))) rendements ({: A 1,: B 2} {: C 3}) .

mappe se lit à la fois des vecteurs et applique les index respectifs à dans , fusionnant les cartes de chaque index. Comme mappe s'arrête lorsque l'une des collections est épuisée, nous devons concates nil à la collection plus courte.

Edit : Comme toujours, cela a déjà été répondu auparavant: Utilisation de" carte "avec des collections de tailles différentes dans le clojure


0 commentaires

1
votes

Généralement, vous pouvez simplement utiliser mappe et fusionner pour fusionner des collections de hashmaps, mais il finira de la fusion lorsque l'une des collections est épuisée.

Vous pouvez créer une fonction comme ci-dessous pour "étendre" les collections pour avoir la même longueur, puis fusionner comme d'habitude: xxx

Notez que dans votre exemple, vous avez utilisé une parenthèse autour de la DATA , 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 [ et ] à la place. Notez également que cette fonction dépend du fait que vous pouvez réellement compter les collections que vous y transmettez (dans le clojure, vous pouvez avoir " les collections infinies ", telles que < code> (plage) ).


0 commentaires

0
votes

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"}] ) )


0 commentaires