Ответ 1
просто вызовите stringify_keys
(или stringify_keys!
)
Я использую Ruby on Rails 3.2.2, и мне бы хотелось "легко" / "быстро" изменить хеш-ключи от Symbol
до String
s. То есть от {:one => "Value 1", :two => "Value 2", ...}
до {"one" => "Value 1", "two" => "Value 2", ...}
.
Как я могу это сделать, используя меньшее количество кода?
просто вызовите stringify_keys
(или stringify_keys!
)
Используйте методы stringify_keys
/stringify_keys!
класса Hash
.
Вы также можете использовать some_hash.with_indifferent_access
для возврата экземпляра Hash, где ваш ключ может быть указан как символы или как строки без разницы.
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"
в качестве ключей, последний будет иметь приоритет и перезаписать первый.
http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys
hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
есть хорошая библиотека, которая делает трюк, библиотека "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"}
new_hash = Hash.new
your_hash.each{ |k,v| new_hash[k.to_s] = v }
new_hash будет таким же, как your_hash, но со строковыми ключами
Я пришел сюда, чтобы посмотреть, было ли что-то лучше, чем:
JSON.parse(hash.to_json)
Но я думаю, что буду придерживаться того, что у меня есть.
Вы можете явно передать ключ из символов в строки: hash = hash.map { |k, v| [k.to_s, v] }.to_h
hash = hash.transform_keys(&:to_s)
превращает все ключи из символов в строки.
Подробнее здесь: https://ruby-doc.org/core-2.6.3/Hash.html#method-i-transform_keys
Это было добавлено в ruby 2.5: https://bugs.ruby-lang.org/issues/13583