更好的数组哈希转换方式

问题描述 投票:1回答:5

我有一个数组,我想将其转换为哈希。我希望数组元素是键,所有值都相同。

这是我的代码:

h = Hash.new
myarr.each do |elem|
  h[elem] = 1
end

另一种选择是following。我不认为它与上述解决方案有很大不同。

h = Hash[ *myarr.collect { |elem| [elem, 1] }.flatten ]

有没有更好的方法可以做到这一点?

ruby arrays hash ruby-1.9
5个回答
3
投票

首先,Hash[]非常乐意得到一个数组阵列,所以你可以抛出splat和flatten,然后这样说:

h = Hash[myarr.map { |e| [ e, 1 ] }]

我想你可以用each_with_object代替:

h = myarr.each_with_object({}) { |e, h| h[e] = 1 }

另一个选择是zip你的myarr与适当的1s阵列,然后喂它到Hash[]

h = Hash[myarr.zip([1] * myarr.length)]

我可能会使用第一个。


6
投票

代码OP写的,也可以写成: -

a = %w(a b c d)
Hash[a.each_with_object(1).to_a]
# => {"a"=>1, "b"=>1, "c"=>1, "d"=>1}

如果你有Ruby版本> = 2.1,那么

a.each_with_object(1).to_h
# => {"a"=>1, "b"=>1, "c"=>1, "d"=>1}

3
投票

如果您使用的是Ruby 2.1:

myarr.map{|e| [e,1]}.to_h

另一种聪明的方式(来自@ArupRakshit的评论):

myarr.product([1]).to_h

1
投票

这是另一种选择,使用cycle

Hash[a.zip([1].cycle)]

-1
投票
a.each_with_object({}){|e, h| h[e] = 1}
© www.soinside.com 2019 - 2024. All rights reserved.