ruby для каждой пары ключ / значение в хэше - PullRequest
11 голосов
/ 07 декабря 2011

У меня есть небольшая проблема с MongoDB в том, что он возвращает хэши с ключами в двойных кавычках и целыми числами, как плавающие все время, это было проблемой для кого-то еще?

для примеров после сокращения или группировки карт, скажем, у меня есть несколько хешей, которые выглядят так:

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

Но я действительно хочу:

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

Любые идеи о том, как я могу легко преобразовать это?

Ответы [ 2 ]

24 голосов
/ 07 декабря 2011

Вы можете сделать:

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 }
2 голосов
/ 07 декабря 2011

Доверительные интегральные значения 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), и что вы не увидите любые артефакты округления.

Вы заметите, конечно, разницу, если вы поделите поплавок на что-то, кроме фактора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...