2012-04-12 2 views
2

Ich versuche, die untere Karte (Clojure) auf der Grundlage von "col_nm" -Feld zu sortieren, aber nicht dazu in der Lage.Sortierung einer MAP in clojure auf der Grundlage verschachtelter Felder fehlgeschlagen

{:Mawb {:user_val "3", :col_nm "1"}, 
:HawbDate {:user_val "", :col_nm "3"}, 
:EtlBatchID {:user_val "1", :col_nm "2"}} 

sollte die Ausgabe sein:

{:Mawb {:user_val "3", :col_nm "1"}, 
:EtlBatchID {:user_val "1", :col_nm "2"}, 
:HawbDate {:user_val "", :col_nm "3"} } 

jemand kann mir helfen, danke im voraus.

+0

Karten in clojure nicht Auftrag haben, mit Ausnahme der von 'sortiert-map' erstellt Einsen und auch diejenigen sind nur auf Schlüssel sortiert, nicht auf Werte. –

Antwort

5

try this one:

(def m {:Mawb {:user_val "3", :col_nm "1"}, 
     :HawbDate {:user_val "", :col_nm "3"}, 
     :EtlBatchID {:user_val "1", :col_nm "2"}}) 

(sort-by (comp :col_nm second) m) 
=> ([:Mawb {:user_val "3", :col_nm "1"}] 
    [:EtlBatchID {:user_val "1", :col_nm "2"}] 
    [:HawbDate {:user_val "", :col_nm "3"}]) 
+2

Geringfügige Korrektur: '(sort-by (comp: col_nm Sekunde) m)' –

+0

Funktioniert perfekt !! Eine weitere Abfrage als die Sortierung - - gibt es eine eingebaute Funktion oder eine kurze Möglichkeit, die auf der Grundlage der Bedingung auf den verschachtelten diejenigen zu entfernen. Zum Beispiel für diese Karte {: Mawb {: user_val "3",: col_nm "1"}, : HawbDate {: Benutzer_val "",: col_nm "3"}, : EtlBatchID {: user_val "1", : col_nm ""}} if "col_nm" -Feld der Ausgang { leer sein sollte: MAWB {: user_val "3": col_nm "1"}, : HawbDate {: user_val "",: col_nm " 3 "} } – Avi

+0

@Avi' (Filter (comp pos? Count: col_nm Sekunde) m) ' – user100464

Verwandte Themen