web-dev-qa-db-ja.com

rubyハッシュ内のキーと値のペアごと

MongoDBには、キーが二重引用符で囲まれ、整数が常に浮動小数点として返されるという点で少し問題がありますが、これは他の誰かにとって問題でしたか?

たとえば、マップを縮小またはグループ化した後の例として、次のようなハッシュがたくさんあるとします。

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

しかし、私が本当に欲しいのは:

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

簡単に変換する方法について何かアイデアはありますか?

11
JP Silvashy

あなたができること:

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 }
26
Russell

積分を信頼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値を変換します。

しかし、実際にはこれを行う必要はまったくありません。浮動小数点形式を信用しないのはよくあることですが、それらは整数値を正確に表していることがわかります。

データベース内の整数であった値は整数定数(0を含む)と正確に比較され、丸めアーティファクトは表示されないと信頼できます。 。

もちろん、フロートを係数以外の何かで割ると、は違いに気付くでしょう

2
DigitalRoss