2012-02-18 7 views

答えて

35

を削除します:あなただけ(into {} (filter val {...}))を行うならば、あなたは間違っている値を削除しますので

(into {} (filter (comp some? val) {:a :x, :b nil, :c :z})) 

=> {:a :x, :c :z} 

明示的some?チェックを行うことが重要ですboolean false。

+9

です。 ({(a:x:b nil:c:z})) ' – Jonas

+3

ええ、t彼はバージョンを削除する同等です。実際、removeは実際にはClojureソースでフィルタを使用して実装されています: '(filter(complement pred)coll)'。フィルタ付きのバージョンはわずかに高速ですが、removeを使用したバージョンの方が少し短いです:-) – mikera

+0

ネストされたnil値はどうですか? –

0
(into {} (keep (fn [e] (if (val e) e)) {:a :x :b nil :c :z})) 
;;=> {:a :x, :c :z} 

または少し短い:

(into {} (keep #(if (val %) %) {:a :x :b nil :c :z})) 

実際には、あなたのフィルタの提案は、はるかに良いと短いので、私はちょうどそれを使用します。私が使用

(into {} (filter val {:a :x :b nil :c :z})) 
+0

であるあなたの関数が返す(X:Z)の代わりに{の: x:c:z} – mishadoff

+0

mishadoff:tnx fixed now –

5

次のコード:

(into {} (filter val {:a 1, :b 2, :c nil})) 
;;=> {:a 1, :b 2} 

注:これは偽の値だけでなく、NILS、私が使用する

+5

このフィルタも偽ります:( –

+0

私はmikeraの記述方法を使用できますが、ほとんどの場合、nilはfalseを意味し、vvは – mishadoff

3
おそらく

ない最善の解決策が、ここではリストの内包を使用して1だ:

(into {} 
    (for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))] 
    [k v])) 
-3

これを行うための素敵な方法は、実際に(into {} (keep second {:a :x :b nil}))

+0

(2番目の{a:x:b nil})==>(:x)を維持すると、 'into'は例外をスローします。 –

関連する問題