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

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

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

【问题讨论】:

    标签: ruby-on-rails ruby hash


    【解决方案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】:

    【讨论】:

      【解决方案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

          【讨论】:

            猜你喜欢
            • 2011-05-30
            • 1970-01-01
            • 2011-05-19
            • 2018-07-02
            • 2015-05-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多