我对MongoDB有一点问题,它返回带有双引号和整数的键的哈希值一直是浮点数,这对其他人来说是个问题吗?
对于地图缩小或分组后的示例,假设我有一堆看似如下的哈希:
{"unknown"=>54.0, "pedestrians"=>572.0, "vehicles"=>1045.0}
但我真正想要的是:
{ unknown: 54, pedestrians: 572, vehicles: 1045 }
关于如何轻松转换它的任何想法?
答案 0 :(得分:24)
你可以这样做:
original = {"unknown"=>54.0, "pedestrians"=>572.0, "vehicles"=>1045.0}
converted = Hash[ original.map { |key, value| [key.to_sym, value.to_i] } ]
或者,如果您使用的是Rails,则可以将其设为HashWithIndifferentAccess
并只转换值:
original = HashWithIndifferentAccess.new(original)
original.each { |key, value| original[key] = value.to_i }
答案 1 :(得分:2)
为了正确处理所有可能的密钥类型,如果要转换它,我建议如下:
h = {:a => 54.0, :b => 572.0, :c => 1045.0, :d => 'test', :e => 1.23 }
p(h.merge(h) do |k, v|
v = v.to_i if v.is_a?(Float) && v.to_i == v
v
end)
上面的代码将在散列中转换Float值,这些散列实际上是Integer的整数。
但实际上你根本不需要这样做。虽然不信任浮点格式是常见的,但事实证明它们确实代表了完整的值。
您可以相信,数据库中任何整数值都将与整数常量(包括0)完全比较,并且您将不看到任何舍入工件。
当然, 会注意到一个区别,如果你将一个浮点除以一个因子以外的东西。