web-dev-qa-db-de.com

Wie prüfe ich ob ein bestimmter Wert in einem Hash vorhanden ist

Ich verwende Rails und habe ein Hash-Objekt. Ich möchte den Hash nach einem bestimmten Wert durchsuchen. Ich kenne die mit diesem Wert verknüpften Schlüssel nicht.

Wie überprüfe ich, ob ein bestimmter Wert in einem Hash vorhanden ist? Wie finde ich auch den Schlüssel, der diesem bestimmten Wert zugeordnet ist?

22
tyronegcarter

Hash umfasst Enumerable , sodass Sie die vielen Methoden in diesem Modul verwenden können, um den Hash zu durchlaufen. Es hat auch diese praktische Methode:

hash.has_value?(value_you_seek)

So finden Sie den mit diesem Wert verknüpften Schlüssel:

hash.key(value_you_seek)

Diese API-Dokumentation für Ruby (1.9.2) sollte hilfreich sein.

48
rkb
4
Val Akkapeddi

Die Klasse Hash hat die Methode select , die einen neuen Hash von Einträgen zurückgibt, für die der Block wahr ist.

h = { "a" => 100, "b" => 200, "c" => 300 }
h.select {|k,v| v == 200}  #=> {"b" => 200}

Auf diese Weise suchen Sie nach Wert und erhalten Ihren Schlüssel!

1
siame

Stellen Sie sich vor, Sie haben die folgende Array von Hashes

available_sports = [{name:'baseball', label:'MLB Baseball'},{name:'tackle_football', label:'NFL Football'}]

So etwas zu tun, wird den Trick tun

available_sports.any? {|h| h['name'] == 'basketball'}

=> false


available_sports.any? {|h| h['name'] == 'tackle_football'}

=> true

1
d1jhoni1b

Die einfachste Möglichkeit, mehrere Werte in einem Hash zu überprüfen, ist:

h = { a: :b, c: :d }
h.values_at(:a, :c).all? #=> true
h.values_at(:a, :x).all? #=> false

Falls Sie in Rails with ActiveSupport auch nach leeren Werten suchen müssen:

h.values_at(:a, :c).all?(&:present?)

oder

h.values_at(:a, :c).none?(&:blank?)

Das Gleiche in Ruby ohne ActiveSupport kann durch Übergeben eines Blocks erreicht werden:

h.values_at(:a, :c).all? { |i| i && !i.empty? }
1
Anton Orel

Wenn Sie hash.values tun, haben Sie jetzt ein Array.

Auf Arrays können Sie die Enumerable-Suchmethode verwenden include?

hash.values.include?(value_you_seek)
0
Fellow Stranger

Hash#has_key? funktioniert zwar, aber, wie Matz schrieb hier , wurde zugunsten von Hash#key? abgelehnt.

Hashs key?-Methode gibt an, ob ein Schlüssel vorhanden ist oder nicht.

hash.key?(:some_key)
0
Subhash Chandra