1

我正在使用 Ruby on Rails 3.2.2 和 Ruby 1.9.3。我想比较两个Hashes (AB) 以便在true( Hash)包含另一个( A) 的所有键/值时返回。HashB

例如,鉴于我有

params.inspect
# => { "action"=>"...", "controller"=>"...", "key_param1"=>"value_param1", , "key_param2"=>"value_param2", "key_param3"=>"value_param3", ... }

my_hash1.inspect
# => { "key_param1"=>"value_param1", "key_param2"=>"value_param2" }

my_hash2.inspect
# => { "key_param4"=>"value_param4", "key_param1"=>"value_param1" }

my_hash3.inspect
# => {}

然后我正在寻找一种方法(或类似的方法)来制作

params.has_same_keys_and_values_as?(my_hash1)
# => true

params.has_same_keys_and_values_as?(my_hash2)
# => false

params.has_same_keys_and_values_as?(my_hash3)
# => true
4

5 回答 5

1

假设 Hash#keys 和 Hash#values 以相同的顺序返回值:

params.values_at(*my_hash.keys) == my_hash.values
于 2012-08-02T07:17:18.270 回答
1

我认为你可以使用:

a.slice(*b.keys) == b

其中 a 和 b 是您的哈希值。请注意, slice 是一种 rails 方法,而不是 ruby​​。在纯红宝石中,您可以编写:

a.keep_if{|k, v| b[k]} == b
于 2012-08-02T07:24:51.757 回答
0

编辑:这是假设值/键在两个哈希中的顺序不同。

您可以遍历 hash1 中的每个键并使用 has_key? 在哈希 2 上。请记住,这是一种幼稚的解决方案,对于大型数据集可能会很慢。

结帐 has_key?和has_value?这里:http ://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-has_key-3F

你可以循环如下:

hash1.each_key { |key|
    if hash2.has_key?(key)
        do whatever
    endif
}
于 2012-08-02T07:18:00.873 回答
0
class Hash
  def >=(b)  
    eq = true
    b.each { |k, v| eq &= !(self.include? k) ? false : ( ( ((self[k]&&v).is_a? Hash) && !((v||self[k]).empty?) ) ? self[k]>=v : true)}

    return eq
  end

end
params = { "action"=>"...", "controller"=>"...", "key_param1"=>"value_param1", "key_param2"=>"value_param2", "key_param3"=>"value_param3" }
my_hash1 = { "key_param1"=>"value_param1", "key_param2"=>"value_param2" }
my_hash2 = { "key_param4"=>"value_param4", "key_param1"=>"value_param1" }
my_hash3 = {}

p params >= my_hash1 #true
p params >= my_hash2 #false
p params >= my_hash3 #true

它也适用于“深度”哈希:

b = {1 => {2 => {} }, 4 => {} }
a = {1 => {2 => {3 => {} }}, 4 => {}, 5 => "123" }

p a >= b #true
p b >= a #false

PS
一个哈希是否包含另一个哈希

于 2012-08-02T12:55:05.453 回答
0

更好的方法,有一个积极的支持方法,hash.diff,用.empty 包装它?检查它们是否相同

{:one => 1}.diff({:one => 1}).empty?

=> true

{:one => 1}.diff({:one => 2}).empty?

=> false

http://as.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Hash/Diff.html

于 2012-09-11T20:02:22.687 回答