配列をループ0
なしの値を持つハッシュに変換するにはどうすればよいですか。each
たとえば、次の配列があるとします。
[1, 2, 3, 4]
このハッシュを取得したい:
{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
標準的なアプローチはHash[...]です:
Hash[xs.map { |x| [x.to_s, 0] }]
またはEnumerable#mash
、たまたまファセットを使用している場合。もっと簡潔で宣言的なものは考えられません。
xs.mash { |x| [x.to_s, 0] }
array.inject({}) { | a, e | a[e.to_s] = 0; a }
またはよりクリーンな方法で( toklandのおかげで、コメントの議論を参照してください)
array.inject({}) { | a, e | a.update(e.to_s => 0) }
私は単純なものが好きで、おかしなこと#inject
や Hash コンストラクターの引数がどのように機能するかを正確に思い出せません。
array = [1, 2, 3, 4]
hash = {}
array.each do |obj|
hash[obj.to_s] = 0
end
puts hash.inspect # {"1"=>0, "2"=>0, "3"=>0, "4"=>0}
わかりました、実際には、私は使用しますeach_with_object
が、これはより楽しいので投稿します。
ary = *1..4
hash = Hash[ary.zip ary.dup.fill 0]
hash # => {1=>0, 2=>0, 3=>0, 4=>0}