Конвертировать массив хешей с символами - PullRequest
0 голосов
/ 28 мая 2019

У меня есть массив хэшей:

[{'object' => 'ob1', 'quantity' => '2'}, {'object' => 'ob2', 'quantity' => '3'}, .....]

Я хочу преобразовать его в символьную форму:

[{:object => 'ob1', :quantity => '2'}, {:object => 'ob2', :quantity => '3'}, .....]

пробовал с:

symbolized_array = array.each => { |c| c.to_options }

, ноя не получил никакого преобразования, symbolized_array такой же, как массив

почему?

Ответы [ 4 ]

4 голосов
/ 28 мая 2019

Начиная с ruby ​​2.5 есть Hash#transform_keys:

array.map{|hash| hash.transform_keys(&:to_sym) }

До этого он был доступен в activesupport (часть рельсов) вместе с ярлыком symbolize_keys

3 голосов
/ 28 мая 2019

Вы пометили rails, поэтому можете использовать symbolize_keys

array.map(&:symbolize_keys)
3 голосов
/ 28 мая 2019

я не получил никакого преобразования […] почему?

to_options возвращает новый хеш с символизированными ключами, но вы не использовали этот новый хеш -each просто пересекает массив и в конце возвращает массив.

Если вы хотите получить результаты блоков как новый элемент массива, вы должны использовать map:

array.map { |c| c.to_options }    # or array.map(&:to_options)

В качестве альтернативы есть to_options!!), который будет работать вместе с each:

array.each { |c| c.to_options! }  # or array.each(&:to_options!)

Это потому, что to_options!изменяет хэши на месте.


Обратите внимание, что to_options - это псевдоним для symbolize_keys, который может быть немного понятнее.

2 голосов
/ 28 мая 2019

Используйте код ниже.Тогда вы получите ожидаемый результат

array.map! {|my_hash| my_hash.inject({}){|memo,(k,v)| memo[k.to_sym] = v; memo}}

или , просто вы можете использовать array.map(&:symbolize_keys).Этот код будет работать на рельсовой среде

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