从比较一个哈希到另一个哈希,我需要得到已经改变的嵌套哈希的数量
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个哈希值,并找出两者之间已经改变的嵌套哈希值的数量
答案 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