哈希中每个键/值对的ruby

时间:2011-12-06 22:24:16

标签: ruby-on-rails ruby mongodb

我对MongoDB有一点问题,它返回带有双引号和整数的键的哈希值一直是浮点数,这对其他人来说是个问题吗?

对于地图缩小或分组后的示例,假设我有一堆看似如下的哈希:

{"unknown"=>54.0, "pedestrians"=>572.0, "vehicles"=>1045.0}

但我真正想要的是:

{ unknown: 54, pedestrians: 572, vehicles: 1045 }

关于如何轻松转换它的任何想法?

2 个答案:

答案 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)

信任积分FP值

为了正确处理所有可能的密钥类型,如果要转换它,我建议如下:

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)完全比较,并且您将看到任何舍入工件。

当然, 会注意到一个区别,如果你将一个浮点除以一个因子以外的东西。