Jak sprawdzić, czy określony klucz jest obecny w haszu, czy nie?

636

Chcę sprawdzić, czy klucz „użytkownika” jest obecny, czy nie w skrócie sesji. W jaki sposób mogę to zrobić?

Zauważ, że nie chcę sprawdzać, czy wartość klucza wynosi zero, czy nie. Chcę tylko sprawdzić, czy klucz „użytkownika” jest obecny.

Mohit Jain
źródło

Odpowiedzi:

952

Hash„s key?metoda wskazuje, czy dany klucz jest obecny czy nie.

session.key?("user")
sepp2k
źródło
nice: Accessor „string” działa również dla parsowanych obiektów JSON.parse :)
Bijan
2
To nie działa dla mnie, zamiast tego zadziałała metoda: user
Akash Agarwal
295

Chociaż Hash#has_key?praca jest wykonywana, jak zauważa tutaj Matz , została wycofana na korzyść Hash#key?.

hash.key?(some_key)
Bozhidar Batsov
źródło
1
Ładne odniesienie do tej prośby o zmianę i późniejszej odpowiedzi Matza.
Joshua Pinter,
Czy ktoś wie na pewno?
codeforester
41

W najnowszych wersjach Ruby instancja Hash ma key?metodę:

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

Pamiętaj, aby użyć klucza symbolu lub klucza łańcucha w zależności od tego, co masz w swoim skrócie:

{'a' => 2}.key?(:a)
=> false
installero
źródło
2
Apprently istniał już w Ruby 1.6: ruby-doc.com/docs/ProgrammingRuby/html/… (być może wcześniej, nie wiem gdzie sprawdzić, udokumentowane)
Beni Cherniavsky-Paskin
28

Jest bardzo późno, ale najlepiej użyć symboli jako klucza:

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 

Ale podczas tworzenia skrótu, jeśli podasz ciąg jako klucz, wówczas wyszuka ciąg w kluczach.

Ale podczas tworzenia skrótu przekazujesz symbol jako klucz, a następnie has_key? przeszuka klucze za pomocą symbolu.


Jeśli używasz Railsów, możesz użyć, Hash#with_indifferent_accessaby tego uniknąć; zarówno hash[:my_key]i hash["my_key"]skieruje do tego samego rekordu

GB
źródło
6
Jeśli używasz Railsów, możesz użyć, Hash#with_indifferent_accessaby tego uniknąć; oba :my_keyi "my_key"będzie wskazywać na ten sam rekord
Devon Parsons
5

Zawsze możesz użyć, Hash#key?aby sprawdzić, czy klucz jest obecny w haszu, czy nie.

Jeśli nie, to ci zwróci false

hash =  { one: 1, two:2 }

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

hash.key?(:four)
#=> false
Deepak Mahakale
źródło
3

Inny sposób jest tutaj

hash = {one: 1, two: 2}

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

hash.member?(:five)
#=> false
Arvind singh
źródło
0

W Railsach 5 has_key? Metoda sprawdza, czy klucz istnieje w haszowaniu. Składnia do jej użycia to:

YourHash.has_key? :yourkey
BinaryMan
źródło