Clojure - 値がtrueの場合にキーの配列を作成する

私はクロージュをするのが全く新しいです。

I have a JSON like: { "1": true, "2": false, "3": true, "4": false }

値がclojureでtrueとなるキーの配列を作成したいです。この例では、配列は ["1"、 "3"] になります。

私を助けてください。任意の助けがいただければ幸いです。

0
これはかなり広いです。何を試しましたか?私は filter を調べて、誤った値でエントリを除外します。
追加された 著者 Carcigenicate,
@jstuartmilneペアのキーに真の値を付けたいようです。
追加された 著者 Carcigenicate,
私はその質問を理解していません。鍵だけが欲しいということですか。
追加された 著者 jstuartmilne,
Clojureへようこそ。jsonをClojureマップに整列化するためにdata.jsonまたはcheshireを使用しているとします。それが済んだら、キーで地図をフィルタリングすること(leetwinskiの答えの最初の例)はうまくいくでしょう。これはマップがフィルタが取る関数のように扱えるからです。
追加された 著者 Gary,
はい、真の値を持つキーの配列が必要です。
追加された 著者 Tessy Thomas,

6 答え

そのための短くて簡単なスニペットもいくつかあります。

user> (filter m (keys m))
;;=> ("1" "3")

user> (keep (fn [[k v]] (when v k)) m)
;;=> ("1" "3")

user> (for [[k v] m :when v] k)
;;=> ("1" "3")
7
追加された
すばらしいです!これはうまくいった。どうもありがとう。
追加された 著者 Tessy Thomas,

もしあなたが配列の代わりにベクトルを使っても大丈夫なら(あなたはとにかくClojureでベクトルを使うのが普通だから)、あなたは次のようなことをすることができます。

(defn keys-for-truthy-vals [m]
  (->> m (filter val) (mapv key)))

Note The mapv is only so the map call returns a vector. If you want a seq, just use map.

3
追加された
マップペアのキーと値を返すための keyval は既に存在するため、 let バインディングは不要です。
追加された 著者 Lee,
と言っています私はそれを忘れました。それに応じて私の答えを更新しました
追加された 著者 Edward Minnix,

Tupeloライブラリには、 という組み込み関数があります。

(submap-by-vals map-arg keep-vals & opts)

Returns a new map containing entries with the specified vals. Throws for missing vals,
unless `:missing-ok` is specified. Usage:

(submap-by-vals {:a 1 :b 2 :A 1} #{1  }             )  =>  {:a 1 :A 1}
(submap-by-vals {:a 1 :b 2 :A 1} #{1 9} :missing-ok )  =>  {:a 1 :A 1} 

そうすれば、結果として得られるマップで keys 関数を使用することができます。

0
追加された

たぶんこれ?

(->> foo (filter second) keys)

fooは地図です。

0
追加された

If your map is a Something like (->> (filter (fn [[k v]] v) a) (map (fn [[k v]] k))) will work. You can't do it with just a map because you need to drop certain values, so there will need to be some reducing or filtering.

0
追加された
スタイルのニッキング: - >> のようなスレッドマクロを使用する場合は、最初の引数も最初の場所に配置します。例えば。 ( - >> a(filter(,))(map(,)))
追加された 著者 cfrick,
( - >>(filter(fn [[kv]] v)flavour-ids))(map(fn [[kv]] k)))を試してみましたが、エラーが発生しました。 'データ'"。
追加された 著者 Tessy Thomas,

すでに提供されているものと同じですが、マップに留まります。

(キー(フィルター値m))

0
追加された