如何检查哈希表中是否存在特定的键?

756
我想检查会话哈希中是否存在"user"键。我应该如何做到这一点?
请注意,我不想检查键的值是否为零。我只想检查是否存在"user"

我要检查会话哈希中是否存在 "user" 键。我该如何实现此功能?

请注意,我不想检查该键的值是否为空。我只想检查是否存在 "user"

8个回答

1129

Hashkey?方法可以告诉你某个特定的键是否存在。

session.key?("user")

不错:对于JSON.parse解析的对象,"string"访问器也适用 :) - Bijan
3
这对我无效,:user 方法起作用了。 - Akash Agarwal
如果(session["user"])也可以工作,但不确定效率如何。 - Katelynn ruan

342

虽然Hash#has_key?可以完成任务,但正如Matz在这里所提到的那样,它已经被Hash#key?取代了。

hash.key?(some_key)

1
关于那个变更请求以及Matz的后续回应,非常不错的参考资料。 - Joshua Pinter
1
有人确定吗? - codeforester
#has_key 实际上并没有被弃用:https://github.com/rubocop/rubocop/issues/3224#issuecomment-226175176 - jayqui

56

哈希实例有一个key?方法:

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

请确保根据您的哈希表中包含的内容使用符号键或字符串键:

{'a' => 2}.key?(:a)
=> false

3
似乎早在Ruby 1.6版本中就已经存在了:http://ruby-doc.com/docs/ProgrammingRuby/html/ref_c_hash.html#Hash.key_qm(也许更早,不知道在哪里查找记录)。 - Beni Cherniavsky-Paskin

37

现在已经很晚了,但最好还是使用符号作为密钥:

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 

如果在创建哈希时,将字符串作为键传递给哈希,那么它将搜索键中的字符串。

但是,如果在创建哈希时使用符号作为键,则 has_key?将使用符号搜索键。


如果您正在使用Rails,则可以使用 Hash#with_indifferent_access 来避免这种情况; hash [: my_key]hash [“my_key”] 将指向同一条记录。


7
如果您使用Rails,可以使用Hash#with_indifferent_access来避免这种情况;:my_key“my_key”将指向同一条记录。 - Devon Parsons
这是最好的答案,特别是当你正在寻找来自变量的关键字时,例如 my_hash.has_key? my_key.to_sym :) - q9f

9
另一种方法在这里。
hash = {one: 1, two: 2}

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

hash.member?(:five)
#=> false

5

您可以始终使用Hash#key?来检查哈希表中是否存在键。

如果不存在,则会返回false

hash =  { one: 1, two:2 }

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

hash.key?(:four)
#=> false

4
在Rails 5中,has_key?方法用于检查哈希表中是否存在指定的键(key)。其语法如下:
YourHash.has_key? :yourkey

0
h = {}
if h.respond_to?(:key?) && h.key?('text') #with respond_to method check if it's hash
   puts h['text'] 
end

请记住,Stack Overflow 不仅旨在解决当前的问题,还要帮助未来的读者找到类似问题的解决方案,这需要理解底层代码。对于我们社区中的初学者和不熟悉语法的成员来说,这尤其重要。鉴于此,您能否编辑您的答案,包括您正在做什么以及为什么您认为这是最好的方法的解释 - Jeremy Caney

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接