如何比较2个哈希并找出有多少嵌套哈希发生了变化

时间:2016-03-15 05:49:39

标签: ruby-on-rails ruby ruby-on-rails-4

从比较一个哈希到另一个哈希,我需要得到已经改变的嵌套哈希的数量

 hash1 = {"0"=>{"value"=>"value", "id"=>"1"}, "1"=>{"value"=>"value1", "id"=>"2"}, "2"=>{"value"=>"", "id"=>"3"}}

 hash2 = {"0"=>{"value"=>"value", "id"=>"1"}, "1"=>{"value"=>"random", "id"=>"2"}, "2"=>{"value"=>"seven", "id"=>"3"}}

value中的值将是唯一发生变化的值。通过比较上面的两个哈希,您可以看到已经更改的嵌套哈希

"1"=>{"value"=>"value1", "id"=>"2"}, 

"1"=>{"value"=>"random", "id"=>"2"}

"2"=>{"value"=>"", "id"=>"3"} 

"2"=>{"value"=>"seven", "id"=>"3"}

我不确定如何比较这样的2个哈希值,并找出两者之间已经改变的嵌套哈希值的数量

3 个答案:

答案 0 :(得分:2)

我认为您可以hash1.to_a - hash2.to_a来获取差异

答案 1 :(得分:0)

编辑:我看到我错过了,“关键值中的值将是唯一改变的东西。”我的回答允许更改"value"以外的键的值。如果OP或任何读者对这个问题感兴趣,我会留下我的答案。

这有三种方法可以做到。

逐步执行哈希和计数差异

hash1.reduce(0) { |count,(k,v)| count + ((hash2[k]["value"]==v["value"]) ? 0 : 1) }
  #=> 2

使用Hash#merge

此方法使用Hash#merge的形式,该方法使用块来确定在两个哈希值合并时存在键时的值。我实际上并没有将块用于其预期目的,但只是在两个值相等时递增count

count = 0
hash1.merge(hash2) { |_,v1,v2| count += 1 unless v1["value"] == v2["value"] }
count
  #=> 2

获取密钥,提取值,压缩它们,总结差异数量

keys = hash1.keys
  #=> ["0", "1", "2"]
hash1.values_at(*keys).zip(hash2.values_at(*keys)).reduce(0) { |count,(v1,v2)|
  count + ((v1["value"] == v2["value"]) ? 0 : 1) }
  #=> 2

这些方法都不需要在两个哈希中对键进行相同的排序。

答案 2 :(得分:0)

在简单的解决方案中,我建议您迭代每个键并比较两个哈希值中的嵌套哈希值。 正如你所说,两个哈希的键是相似的,这个解决方案应该是合适的:

count = 0    
hash1.keys.each do
  count = count + 1 if hash1[key] != hash2[key]
end
# p count