Wie kann ich überprüfen, ob ein bestimmter Schlüssel in einem Hash vorhanden ist oder nicht?

634

Ich möchte überprüfen, ob der "Benutzer" -Schlüssel im Sitzungs-Hash vorhanden ist oder nicht. Wie kann ich das machen?

Beachten Sie, dass ich nicht überprüfen möchte, ob der Wert des Schlüssels Null ist oder nicht. Ich möchte nur überprüfen, ob der "Benutzer" -Schlüssel vorhanden ist.

Mohit Jain
quelle

Antworten:

950

HashDie key?Methode von ' sagt Ihnen, ob ein bestimmter Schlüssel vorhanden ist oder nicht.

session.key?("user")
sepp2k
quelle
nice: "string" accessor funktioniert auch für JSON.parse analysierte Objekte :)
Bijan
2
Dies funktioniert bei mir nicht, stattdessen funktioniert die: user-Methode
Akash Agarwal
295

Während Hash#has_key?die Arbeit erledigt wird, wie Matz hier feststellt , wurde sie zugunsten von abgelehnt Hash#key?.

hash.key?(some_key)
Bozhidar Batsov
quelle
1
Netter Hinweis auf diese Änderungsanforderung und nachfolgende Antwort von Matz.
Joshua Pinter
Weiß jemand sicher?
Codeforester
41

In den neuesten Ruby-Versionen verfügt die Hash-Instanz über eine key?Methode:

{a: 1}.key?(:a)
=> true

Stellen Sie sicher, dass Sie den Symbolschlüssel oder einen String-Schlüssel verwenden, je nachdem, was Sie in Ihrem Hash haben:

{'a' => 2}.key?(:a)
=> false
installero
quelle
2
Anscheinend gab es bereits Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/… (vielleicht früher, keine Ahnung, wo dokumentiert werden soll)
Beni Cherniavsky-Paskin
28

Es ist sehr spät, aber vorzugsweise sollten Symbole als Schlüssel verwendet werden:

my_hash = {}
my_hash[:my_key] = 'value'

my_hash.has_key?("my_key")
 => false 
my_hash.has_key?("my_key".to_sym)
 => true 

my_hash2 = {}
my_hash2['my_key'] = 'value'

my_hash2.has_key?("my_key")
 => true 
my_hash2.has_key?("my_key".to_sym)
 => false 

Wenn Sie jedoch beim Erstellen eines Hashs eine Zeichenfolge als Schlüssel übergeben, wird in Zeichen nach der Zeichenfolge gesucht.

Aber wenn Sie einen Hash erstellen, übergeben Sie das Symbol als Schlüssel und dann has_key? sucht die Schlüssel mit dem Symbol.


Wenn Sie Rails verwenden, können Sie dies Hash#with_indifferent_accessvermeiden. beide hash[:my_key]und hash["my_key"]zeigen auf den gleichen Datensatz

GB
quelle
6
Wenn Sie Rails verwenden, können Sie dies Hash#with_indifferent_accessvermeiden. beide :my_keyund "my_key"wird auf den gleichen Rekord verweisen
Devon Parsons
5

Sie können jederzeit Hash#key?überprüfen, ob der Schlüssel in einem Hash vorhanden ist oder nicht.

Wenn nicht, wird es Sie zurückgeben false

hash =  { one: 1, two:2 }

hash.key?(:one)
#=> true

hash.key?(:four)
#=> false
Deepak Mahakale
quelle
3

Ein anderer Weg ist hier

hash = {one: 1, two: 2}

hash.member?(:one)
#=> true

hash.member?(:five)
#=> false
Arvind singh
quelle
0

In Rails 5 ist der has_key? Die Methode prüft, ob der Schlüssel im Hash vorhanden ist. Die Syntax dafür lautet:

YourHash.has_key? :yourkey
BinaryMan
quelle