【问题标题】:How to check if an hash is "completely" included in another hash?如何检查一个哈希是否“完全”包含在另一个哈希中?
【发布时间】:2011-11-26 22:34:53
【问题描述】:

我正在使用 Ruby on Rails 3.1.0,我想检查一个哈希是否“完全”包含在另一个哈希中并返回一个 boolean 值。

假设我有这些哈希:

hash1 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3'
}

hash2 = {
  :key1 => 'value1',
  :key2 => 'value2',
  :key3 => 'value3',
  :key4 => 'value4',
  :key5 => 'value5',
  ...
}

我想检查hash1 是否包含在hash2 中,即使hash2 中的值多于hash1(在上述情况下,我正在寻找的响应应该是@ 987654326@)? 是否有可能使用“一行代码”\“一个 Ruby 方法”

【问题讨论】:

  • 也许你可以将 hash1 合并到 hash2 (hash2.merge(hash1)) 中看看它是否改变了。这是一种非常幼稚的方法,但如果它是你想要的一行代码,它可能是最简单的方法。

标签: ruby-on-rails ruby ruby-on-rails-3 methods hash


【解决方案1】:

这就够了

(hash1.to_a - hash2.to_a).empty?

【讨论】:

  • 不错。这就是为什么我在答案中添加了“我能想到的”部分;-)
  • 太棒了!我刚刚花了一个小时与 collect include? values_at 和朋友们一起玩......没有合理的结果。终于找到了这个答案。如此简单。
【解决方案2】:

我能想到的最简单的方法是:

hash2.values_at(*hash1.keys) == hash1.values

【讨论】:

    【解决方案3】:

    更优雅的方法是在一个哈希合并另一个哈希时检查相等性。

    例如重写哈希包括?这个的实例方法。

    class Hash
      def include?(other)
        self.merge(other) == self
      end
    end
    
    {:a => 1, :b => 2, :c => 3}.include? :a => 1, :b => 2 # => true
    

    【讨论】:

      【解决方案4】:

      有办法:

      hash_2 >= hash_1
      

      或者:

      hash_1 <= hash_2
      

      这篇文章的更多信息:https://olivierlacan.com/posts/proposal-for-a-better-ruby-hash-include/

      【讨论】:

        【解决方案5】:

        我发现的最有效和最优雅的解决方案 - 没有中间数组或冗余循环。

        class Hash
          alias_method :include_key?, :include?
        
          def include?(other)
            return include_key?(other) unless other.is_a?(Hash)
            other.all? do |key, value|
              self[key] == value
            end
          end
        end
        

        从 Ruby 2.3 开始,您可以使用内置的Hash#&lt;= 方法。

        【讨论】:

          【解决方案6】:

          我不确定我是否理解哈希中的包含概念。 查看它是否具有相同的键(通常的问题)。 hash1 中的所有键都包含在 hash2 中: hash1.keys - hash2.keys == []

          然后,如果您想比较这些值,请按照上一篇文章中的建议进行操作: hash1.values - hash2.values_at(*hash1.keys) == []

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2011-04-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-28
            • 1970-01-01
            • 2017-04-13
            相关资源
            最近更新 更多