Обратный поиск на карте

Мне нужно извлечь ключ с карты, используя значение. Есть ли способ сделать это иначе, чем реализовать обратный просмотр?

Ответ 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))