2012-02-20 28 views
5

Tôi có một chức năng muốn kéo giá trị ra khỏi bản đồ dựa trên thứ tự ưu tiên. Hiện tại tôi đang làm nó như một cấu trúc lồng nhau nếu là khủng khiếp. Tôi phải tin rằng có một cách tốt hơn.Giá trị trích xuất Clojure từ bản đồ dựa trên logic được ưu tiên

Trong khi tác phẩm này có cách nào tốt hơn?

(defn filter-relatives [relatives] 
    (if(contains? relatives :self) 
     (relatives :self) 
      (if(contains? relatives :north) 
       (relatives :north) 
        (if(contains? relatives :west) 
         (relatives :west) 
         (if(contains? relatives :east) 
          (relatives :east) 
          (relatives :south) 
         ) 
        ) 
       ) 
      ) 
     ) 
    ) 
) 

Trả lời

9
(some relatives [:self :north :west :east :south]) 
+1

Đây là câu trả lời đúng. –

+1

... trừ khi bạn cũng muốn tìm nạp giá trị nil. –

+3

... hoặc 'false'. Nếu đó là một vấn đề, hãy xem câu trả lời của tôi cho một điều chỉnh thích hợp, nếu không chắc chắn sử dụng điều này. –

5

gì về:

(defn filter-relatives [relatives ordered-filters] 
    (first (filter identity (map relatives ordered-filters)))) 

mẫu chạy:

user=> (filter-relatives {:a 1 :b 2 :c 3} [:z :b :a])                
2 
5

Những câu trả lời khác cũng tốt nếu nilfalse không nằm trong số các giá trị có thể. Nếu có, bạn có thể sử dụng một cái gì đó như

(if-let [e (some (partial find relatives) 
       [:self :north :west :east :south])] 
    (val e) 
    :no-key-found) 

Ví dụ:

(if-let [e (some (partial find relatives) 
       [:self :north :west :east :south])] 
    (val e) 
    :no-key-found) 
; => false 

(if-let [e (some (partial find {}) 
       [:self :north :west :east :south])] 
    (val e) 
    :no-key-found) 
; => :no-key-found 
1
(first (keep relatives [:self :north :west :east :south])) 
Các vấn đề liên quan