转换带有符号的哈希数组

时间:2019-05-28 09:54:31

标签: ruby-on-rails ruby

我有一个哈希数组:

[{'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 个答案:

答案 0 :(得分:4)

从ruby 2.5开始,就有Hash#transform_keys

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

在此之前,它与快捷方式symbolize_keys一起在activesupport(导轨的一部分)中可用

答案 1 :(得分:3)

您标记了rails,因此您可以使用symbolize_keys

array.map(&:symbolize_keys)

答案 2 :(得分:3)

  

我没有获得任何转换[...]为什么?

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_optionssymbolize_keys的别名,可能更清楚了。

答案 3 :(得分:2)

使用以下代码。然后您将获得预期的输出

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

,您只需使用array.map(&:symbolize_keys)。该代码将在Rails环境下工作