1 つの方法を次に示します。
(some #(if (= "GEICO" (:name %)) %) testVMap)
testVMap
つまり、 が:name
と等しい最初のものを返し"GEICO"
ます。 を関数パラメータとして#(... % ...)
関数を定義します。%
この部分は、各マップの値(:name %)
の値を返します。:name
複数の「GEICO」マップが存在する可能性があり、それらすべてが必要な場合は、filter
代わりにsome
.
別のバージョンは次のとおりです。
(some #(and (= "GEICO" (:name %)) %) testVMap)
あなたも使いたくなるかもしれませんupdate
。
編集:例:
(map #(if (= "GEICO" (:name %))
(update % :rate inc)
%)
testVMap)
これinc
は、数値に 1 を加算する関数です。同じものである #(+ 10 %)
、 またはなど、必要な変換を実行する関数に置き換える必要があります。(partial + 10)
によって定義された関数#(...)
は、の値が「GEICO」であるかどうかをチェックし:name
、そうであれば、指定した関数でレートを更新します (inc
この場合)。それ以外の場合#(...)
は、マップを変更せずに返します。
update
コンテキストから自明でない場合は、のドキュメントを調べるのはあなたに任せます。
mapv
の代わりに使用することもできますmap
。
これらすべてを 1 つ以上の関数に組み込みたいと思うことは間違いありません。関数は Clojure のものであることを思い出してください。それらは「データ」、ファースト クラス オブジェクトなどですinc
。関数はupdate
、コードの一部で (代わりにinc
) を使用します。
必要なマップが存在しない場合のマップの追加について: 長い一連のマップを扱っていない場合は、別の手順でこれを行うことを検討します。コレクションに要素が含まれているかどうかをテストするのに役立つ関数の名前については、Andre の回答を参照してください。
ただし、ベクトルに存在しないものが含まれているかどうかをテストするには、Clojure がベクトル全体を調べる必要があることに注意してください。ベクトルではなく Clojure セットを使用するか、(たとえば) 、 などをキーとして外側のマップを使用することを検討することをお勧め:aaa
し:geico
ます。その場合は、関数を見てくださいupdate-in
。