キーと値のペアを分解する方法はありますか? マップをパラメーターとして受け取る関数があります。パラメーター自体のキーと値の両方の値を抽出したいと思います。それ、どうやったら出来るの ?
ベクトルで次のことができます-
((fn [[ab]] (str ab)) [ab])
マップと同じ/類似のことを行うにはどうすればよいですか -
((fn[{kv}] (str kv)) {kv})
ありがとう、ムルタザ
キーと値のペアを分解する方法はありますか? マップをパラメーターとして受け取る関数があります。パラメーター自体のキーと値の両方の値を抽出したいと思います。それ、どうやったら出来るの ?
ベクトルで次のことができます-
((fn [[ab]] (str ab)) [ab])
マップと同じ/類似のことを行うにはどうすればよいですか -
((fn[{kv}] (str kv)) {kv})
ありがとう、ムルタザ
関数 arg リストでのマップの分解は、マップから特定のキーを抽出し、次のように名前を付けるために設計されています。
core> (defn foo [{my-a :a my-b :b}] {my-a my-b})
core/foo
core> (foo {:a 1 :b 2})
{1 2}
このチュートリアルをお勧めします。((fn[{k v}] (str k v)) {k v})
マップには多くのキーと多くの値が含まれている可能性があるため、構造化コードはどこでどのキーと値を探しているかを判断できないため、直接同等のものを与えるのは少し難しいです。キーによる破壊は、推論が容易です。
マップ内の最初のエントリを任意に選択したい場合は、それを抽出して、単一のマップ エントリでリスト分解形式を使用できます。
core> (defn foo [[k v]] {v k})
#'core/foo
core> (foo (first {1 2}))
{2 1}
[k v]
この例では、first は最初のマップ エントリをベクトルとして返すため、リスト分割形式が使用されます。
マップを破棄するために利用できるショートカットがあります。たとえば、特定のキーを探している場合は、name1:key1 name1:key2..と入力する必要はありません。
例えば
main=> (defn fbb [{:keys [foo bar baz]}] (+ foo bar baz))
#'main/fbb
main=> (fbb {:foo 2 :bar 3 :baz 4})
9
それ以外の...
(defn fbb [{foo :foo bar :bar baz :baz}] (+ foo bar baz))
マップキーが文字列の場合は、:strs
代わりに言うことができ:keys
、記号の場合はを使用できます:syms
。
user=> (for [x (hash-map :a 1 :b 2 :c 3)] (str (first x) " " (second x)))
(":a 1" ":c 3" ":b 2")