比较红宝石中的两个哈希

时间:2016-07-21 06:34:55

标签: ruby hash

我需要在ruby中比较2个哈希,其中一个哈希包含带引号的字符串中的数值,这使得它成为一个字符串。考虑以下2个哈希:

hash1 = {"A"=>"0", "B"=>"1", "SVHTID"=>"VH", "D"=>"0", "E"=>"19930730", "F"=>"TEST - DEPOSIT", "G"=>"2.25000000"}

hash2  = {"a"=>"0", "b"=>1, "c"=>"VH", "d"=>0,"e"=>19930730, "f"=>"TEST - DEPOSIT", "g"=>2.25}

现在我写的代码如下:

hash2 = Hash[hash2.map {|key, value| [key.upcase, value] }]

hash1.each{|k,v| hash1[k] = hash1[k].to_i if hash1[k].match(/-?\d+(?:\.\d+)?/)}

hash1.keys.select { |key| hash1[key] != hash2[key] }.each { |key| 

puts "expected #{key} => #{hash1[key]}, but found #{key} => #{hash2[key]}"

     }

它的作用是将float值转换为整数并且原始值丢失。

我想要的是,当比较上面的2个哈希时,输出应该只包含G作为不匹配的类型,并且应该打印以下内容:

Expected: G=>2.25000000 but found G=>2.25

1 个答案:

答案 0 :(得分:0)

# normalization
h1, h2 = [hash1, hash2].map do |h|
  h.map do |k, v|
    [k.to_s.downcase, v.to_s.to_i.to_s == v.to_s ? v.to_i : v]
  end.to_h
end

现在我们准备进行比较:

h1.reject { |k, v| h2[k].nil? || h2[k] == v }
#⇒ { "g" => "2.25000000" }

可以根据需要打印,格式化等。