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?
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.
Hash.has_value? und Hash.key .
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!
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
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? }
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)
Hash#has_key?
funktioniert zwar, aber, wie Matz schrieb hier , wurde zugunsten von Hash#key?
abgelehnt.
Hash
s key?
-Methode gibt an, ob ein Schlüssel vorhanden ist oder nicht.
hash.key?(:some_key)