ruby 使用相同的键和值将数组转换为哈希的替代方法

z9gpfhce  于 2023-08-04  发布在  Ruby
关注(0)|答案(4)|浏览(133)

我想转换:

[:one, :two, :three]

字符串
致:

{one: :one, two: :two, three: :three}


到目前为止,我正在使用这个:

Hash[[:basic, :silver, :gold, :platinum].map { |e| [e, e] }]


但我想知道是否有可能通过其他方式?
这是在模型中的Rails enum定义中使用的,将值保存为db中的字符串。

ndasle7k

ndasle7k1#

阵列编号zip

a = [:one, :two, :three]
a.zip(a).to_h
#=> {:one=>:one, :two=>:two, :three=>:three}

字符串
阵列编号transpose

[a, a].transpose.to_h
#=> {:one=>:one, :two=>:two, :three=>:three}

2lpgd968

2lpgd9682#

我更喜欢从头开始构造散列,而不是构造一个临时数组(这会消耗内存)并将其转换为散列。

[:one, :two, :three].each_with_object({}) { |e,h| h[e]=e }
  #=> {:one=>:one, :two=>:two, :three=>:three}

字符串

fnx2tebb

fnx2tebb3#

在Ruby on Rails 6+中,可以使用Enumerable#index_with
如果将它与Object#itself结合,它将看起来是这样的:

%i[one two three].index_with(&:itself)

# => {:one=>:one, :two=>:two, :three=>:three}

字符串
是的,使用enum声明存储在数据库中的字符串并使用散列这样的方式很方便。

enum my_attribute: MY_ARRAY.index_with(&:itself)

mctunoxg

mctunoxg4#

下面是map的另一种方法:

>> [:one, :two, :three].map { |x| [x,x] }.to_h
=> {:one=>:one, :two=>:two, :three=>:three}

字符串

相关问题