【问题标题】:ruby for each key/value pair in a hashruby 用于哈希中的每个键/值对
【发布时间】:2011-12-06 22:24:15
【问题描述】:

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

对于地图减少或分组后的示例,假设我有一堆看起来像这样的哈希:

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

但我真正想要的是:

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

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

【问题讨论】:

标签: ruby-on-rails ruby mongodb


【解决方案1】:

你可以这样做:

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 }

【讨论】:

  • 如果值是字符串或者实际上有分数怎么办?
  • @DigitalRoss 好吧,正如 OP 所述,这个答案假定原始哈希始终是 String => Float。如果类型是其他类型,它将不起作用 - 但这不是所要求的。
  • @TylerBrock 谢谢!尽管我删除了使用 tap 的版本,因为我认为使用 map 并转换回 Hash 会更简洁。
【解决方案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)

上面的代码会将散列中的浮点值转换为整数。

但实际上你根本不需要这样做。虽然不信任浮点格式很常见,但事实证明它们确实准确地表示整数值。

您可以相信,数据库中的任何整数值都将与整数常量(包括 0)进行精确比较,并且您将不会看到任何舍入伪影。

注意到差异,当然,如果您将浮点数除以因子以外的其他值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 2016-08-19
    • 2021-06-19
    • 2014-01-02
    相关资源
    最近更新 更多