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

35

我正在使用Rails,有一个哈希对象。我想要在哈希中搜索特定的值,但是不知道与该值相关联的键。

如何检查哈希中是否存在特定值?另外,如何找到与该特定值相关联的键?

8个回答

68

哈希包含Enumerable,因此您可以使用该模块上的许多方法来遍历哈希。它还具有这个方便的方法:

hash.has_value?(value_you_seek)

要找到与该值相关联的键:

hash.key(value_you_seek)

这个Ruby(1.9.2)的API文档应该会有所帮助。


2
这不遍历嵌套哈希。 - Natus Drew

8
检查哈希表中多个值是否存在的最简单方法是:
h = { a: :b, c: :d }
h.values_at(:a, :c).all? #=> true
h.values_at(:a, :x).all? #=> false

如果您需要在Rails中使用ActiveSupport检查空值,请参考以下内容:
h.values_at(:a, :c).all?(&:present?)

或者

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

在没有ActiveSupport的情况下,Ruby中可以通过传递代码块来完成相同的操作:

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

h.values_at(:a, :c).all?(&:present?) 不起作用。 - damuz91
@DavidMauricio,你能提供一个似乎无法工作的例子吗? - Anton Orel

4
假设你有以下的哈希数组: available_sports = [{name:'baseball', label:'MLB 棒球'},{name:'tackle_football', label:'NFL 橄榄球'}] 像这样做就可以实现: available_sports.any? {|h| h['name'] == 'basketball'} => false available_sports.any? {|h| h['name'] == 'tackle_football'} => true

4

2

虽然Hash#has_key?仍然可用,但正如Matz在这里所写的那样,它已经被弃用,推荐使用Hash#key?

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

hash.key?(:some_key)

1

Hash类有select方法,该方法将返回一个新的散列,其中条目的块为真;

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

这样你就可以通过值进行搜索,并获得对应的键!


为什么要这样做,当哈希表已经有内置方法呢? - max

1
如果你执行hash.values,你现在会得到一个数组。
在数组上,你可以使用可枚举的搜索方法include?
hash.values.include?(value_you_seek)

在哈希表中查找键只需要O(1)的操作,但在数组中查找键则需要O(n)的操作。 - Pavlo Razumovskyi

-2

你可以使用更短的版本 hash.values

,它与原文意思相同。


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