it-swarm.com.ru

Как изменить ключи хеша с `Symbol`s на` String`s?

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

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

44
user12882

просто вызовите stringify_keys (или stringify_keys!)

http://apidock.com/Rails/Hash/stringify_keys

63
Viktor Trón

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

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

16
jdoe

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" в качестве ключей в вашем хэше, последний будет иметь приоритет и будет перезаписывать первый.

10
eli

stringify_keys из Rails

http://api.rubyonrails.org/classes/Hash.html#method-i-stringify_keys

hash = { name: 'Rob', age: '28' }
hash.stringify_keys
# => { "name" => "Rob", "age" => "28" }
5
Ery

есть библиотека Nice, которая делает свое дело, это библиотека "facets/hash/rekey" и метод 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"}
3
rik.vanmechelen
 new_hash = Hash.new
 your_hash.each{ |k,v| new_hash[k.to_s] = v }

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

2
abhas

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

JSON.parse(hash.to_json)

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

0
pguardiario