Подтвердить что ты не робот

Как изменить хеш-ключи с `Символы` на `Строки`?

Я использую Ruby on Rails 3.2.2, и мне бы хотелось "легко" / "быстро" изменить хеш-ключи от Symbol до String s. То есть от {:one => "Value 1", :two => "Value 2", ...} до {"one" => "Value 1", "two" => "Value 2", ...}.

Как я могу это сделать, используя меньшее количество кода?

4b9b3361

Ответ 2

Используйте методы stringify_keys/stringify_keys! класса Hash.

Вы также можете использовать some_hash.with_indifferent_access для возврата экземпляра Hash, где ваш ключ может быть указан как символы или как строки без разницы.

Ответ 3

stringify_keys хорош, но доступен только в Rails. Здесь, как бы я сделал это в одной строке с нулевыми зависимостями:

new_hash = Hash[your_hash.collect{|k,v| [k.to_s, v]}]

Это работает на Ruby 1.8.7 и выше. Если вы работаете с Ruby 2.1, вы можете сделать:

new_hash = a.collect{|k,v| [k.to_s, v]}.to_h

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

Ответ 5

есть хорошая библиотека, которая делает трюк, библиотека "facets/hash/rekey" и метод является ключом!. Пример моего использования ниже. Это всего лишь копия

> require 'facets/hash/rekey'
 => true
> a = {:one => "Value 1", :two => "Value 2"}
 => {:one=>"Value 1", :two=>"Value 2"} 
> a.rekey!(&:to_s)
 => {"one"=>"Value 1", "two"=>"Value 2"} 
> a
 => {"one"=>"Value 1", "two"=>"Value 2"}

Ответ 6

 new_hash = Hash.new
 your_hash.each{ |k,v| new_hash[k.to_s] = v }

new_hash будет таким же, как your_hash, но со строковыми ключами

Ответ 7

Я пришел сюда, чтобы посмотреть, было ли что-то лучше, чем:

JSON.parse(hash.to_json)

Но я думаю, что буду придерживаться того, что у меня есть.

Ответ 8

Вы можете явно передать ключ из символов в строки:
hash = hash.map { |k, v| [k.to_s, v] }.to_h