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

Posted

技术标签:

【中文标题】如何检查哈希中是不是存在特定值?【英文标题】:How to check if specific value is present in a hash?如何检查哈希中是否存在特定值? 【发布时间】:2012-02-19 04:59:47 【问题描述】:

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

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

【问题讨论】:

【参考方案1】:

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

hash.has_value?(value_you_seek)

要查找与该值关联的键:

hash.key(value_you_seek)

这个API documentation for Ruby (1.9.2) 应该会有所帮助。

【讨论】:

这不会遍历嵌套哈希【参考方案2】:

检查哈希中是否存在多个值的最简单方法是:

h =  a: :b, c: :d 
h.values_at(:a, :c).all? #=> true
h.values_at(:a, :x).all? #=> false

如果您还需要使用 ActiveSupport 检查 Rails 中的空白值:

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?) 不起作用 @DavidMauricio 你能提供一个似乎行不通的例子吗?【参考方案3】:

Hash.has_value? 和 Hash.key。

【讨论】:

【参考方案4】:

假设您有以下 Array 的哈希

available_sports = [name:'baseball', label:'MLB Baseball',name:'tackle_football', label:'NFL Football']

这样就行了

available_sports.any? |h| h['name'] == 'basketball'

=> false


available_sports.any? |h| h['name'] == 'tackle_football'

=> true

【讨论】:

【参考方案5】:

虽然 Hash#has_key? 有效,但正如 Matz 写的 here,它已被弃用,取而代之的是 Hash#key?

Hashkey? 方法告诉您给定的键是否存在。

hash.key?(:some_key)

【讨论】:

【参考方案6】:

Hash 类具有 select 方法,该方法将返回块为真的条目的新哈希;

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

这样您就可以按值搜索,并获得您的密钥!

【讨论】:

Hash 有内置方法时为什么要这样做?【参考方案7】:

如果你使用hash.values,你现在就有了一个数组。

在数组上,您可以使用 Enumerable 搜索方法include?

hash.values.include?(value_you_seek)

【讨论】:

在哈希中找到一个键需要 O(1) 次操作,但在数组中找到一个键需要 O(n) 次操作。【参考方案8】:

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

【讨论】:

以上是关于如何检查哈希中是不是存在特定值?的主要内容,如果未能解决你的问题,请参考以下文章

如何知道映射表中是不是存在特定值?

如何检查在mysql中存储多个值的变量中是不是存在特定值?

如何检查sql的第一列或第二列中是不是存在一个特定值?

如何遍历列,检查任何列中是不是存在特定值,改变新列并输入 1 如果存在,如果不存在则输入 0?

如何检查数据表中是不是存在值

如何检查 Perl 的哈希中是不是存在密钥? [复制]