Мне нужно извлечь ключ с карты, используя значение. Есть ли способ сделать это иначе, чем реализовать обратный просмотр?
Обратный поиск на карте
Ответ 1
Попробуйте
(some #(if (= (val %) your-val) (key %)) your-map)
Ответ 2
Я думаю, что map-invert
- правильный способ сделать это.
;; Despite being in clojure.set, this has nothing to do with sets.
user=> (map-invert {:a 1, :b 2})
{2 :b, 1 :a}
;; If there are duplicate keys, one is chosen:
user=> (map-invert {:a 1, :b 1})
{1 :b}
;; I suspect it'd be unwise to depend on which key survives the clash.
Ответ 3
Вы можете легко перевернуть карту с помощью двухстрочной функции:
(defn reverse-map [m]
(into {} (map (fn [[a b]] [b a]) m)))
(def a {:a 1 :b 2 :c 3})
(reverse-map a)
=> {1 :a, 3 :c, 2 :b}
((reverse-map a) 1)
=> :a
Ответ 4
Если вы используете ClojureScript или вам нужна еще одна альтернатива:)
(zipmap (vals m) (keys m))
Ответ 5
Другой:
(defn reverse-map [m]
(apply hash-map (mapcat reverse m)))
(defn reverse-lookup [m k]
(ffirst (filter (comp #{k} second) m)))
Ответ 6
если вы хотите сохранить ключи, лучше просто перевернуть карту, но собрать старые ключи в списке /etc и т.д.
(defn map-inverse [m]
(reduce (fn [m' [k v]] (update m' v clojure.set/union #{k})) {} m))
(defn map-inverse [m]
(reduce (fn [m' [k v]] (update m' v conj k)) {} m))