Clojureマップnil
の値をフィルタリングする最も良い方法は何ですか{}
?ClojureのマップにNil値はありますか?
{ :a :x :b nil :c :z }
;;=> { :a :x, :c :z }
Clojureマップnil
の値をフィルタリングする最も良い方法は何ですか{}
?ClojureのマップにNil値はありますか?
{ :a :x :b nil :c :z }
;;=> { :a :x, :c :z }
を削除します:あなただけ(into {} (filter val {...}))
を行うならば、あなたは間違っている値を削除しますので
(into {} (filter (comp some? val) {:a :x, :b nil, :c :z}))
=> {:a :x, :c :z}
明示的some?チェックを行うことが重要ですboolean false。
(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}))
であるあなたの関数が返す(X:Z)の代わりに{の: x:c:z} – mishadoff
mishadoff:tnx fixed now –
次のコード:
(into {} (filter val {:a 1, :b 2, :c nil}))
;;=> {:a 1, :b 2}
注:これは偽の値だけでなく、NILS、私が使用する
このフィルタも偽ります:( –
私はmikeraの記述方法を使用できますが、ほとんどの場合、nilはfalseを意味し、vvは – mishadoff
ない最善の解決策が、ここではリストの内包を使用して1だ:
(into {}
(for [[k v] {:a 1 :b nil :c :z} :when (not (nil? v))]
[k v]))
これを行うための素敵な方法は、実際に(into {} (keep second {:a :x :b nil}))
(2番目の{a:x:b nil})==>(:x)を維持すると、 'into'は例外をスローします。 –
です。 ({(a:x:b nil:c:z})) ' – Jonas
ええ、t彼はバージョンを削除する同等です。実際、removeは実際にはClojureソースでフィルタを使用して実装されています: '(filter(complement pred)coll)'。フィルタ付きのバージョンはわずかに高速ですが、removeを使用したバージョンの方が少し短いです:-) – mikera
ネストされたnil値はどうですか? –