Как изменить значения хэша? - PullRequest
113 голосов
/ 01 мая 2009

Я бы хотел заменить каждый value в хэше на value.some_method.

Например, для данного простого хэша:

{"a" => "b", "c" => "d"}` 

каждое значение должно быть .upcase d, поэтому оно выглядит следующим образом:

{"a" => "B", "c" => "D"}

Я пытался #collect и #map, но всегда просто возвращал массивы. Есть ли элегантный способ сделать это?

ОБНОВЛЕНИЕ

Черт, я забыл: хеш находится в переменной экземпляра, которую нельзя менять. Мне нужен новый хэш с измененными значениями, но я бы предпочел не определять эту переменную явно, а затем перебирать ее, заполняя ее. Что-то вроде:

new_hash = hash.magic{ ... }

Ответы [ 12 ]

1 голос
/ 01 мая 2009

Я делаю что-то вроде этого:

new_hash = Hash [* original_hash.collect {| ключ, значение | [ключ, значение + 1]}. flatten]

Это дает вам возможность преобразовывать ключ или значение с помощью любого выражения (и это, конечно, не разрушительно).

0 голосов
/ 24 ноября 2014

Rails-специфичные

Если кому-то нужно только вызвать метод to_s для каждого из значений и не использовать Rails 4.2 (который включает transform_values метод ссылка ), вы можете сделать следующее:

original_hash = { :a => 'a', :b => BigDecimal('23.4') }
#=> {:a=>"a", :b=>#<BigDecimal:5c03a00,'0.234E2',18(18)>}
JSON(original_hash.to_json)
#=> {"a"=>"a", "b"=>"23.4"}

Примечание. Необходимо использовать библиотеку 'json'.

Примечание 2: Это также превратит ключи в строки

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