2

配列をループ0なしの値を持つハッシュに変換するにはどうすればよいですか。each

たとえば、次の配列があるとします。

[1, 2, 3, 4]

このハッシュを取得したい:

{"1"=>0, "2"=>0, "3"=>0, "4"=>0}
4

4 に答える 4

8

標準的なアプローチはHash[...]です:

Hash[xs.map { |x| [x.to_s, 0] }]

またはEnumerable#mash、たまたまファセットを使用している場合。もっと簡潔で宣言的なものは考えられません。

xs.mash { |x| [x.to_s, 0] }
于 2012-09-10T22:08:23.733 に答える
4
array.inject({}) { | a, e | a[e.to_s] = 0; a }

またはよりクリーンな方法で( toklandのおかげで、コメントの議論を参照してください)

array.inject({}) { | a, e | a.update(e.to_s => 0) }
于 2012-09-10T22:06:11.763 に答える
2

私は単純なものが好きで、おかしなこと#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}
于 2012-09-10T22:12:21.107 に答える
0

わかりました、実際には、私は使用しますeach_with_objectが、これはより楽しいので投稿します。

ary = *1..4

hash = Hash[ary.zip ary.dup.fill 0]

hash # => {1=>0, 2=>0, 3=>0, 4=>0}
于 2012-09-10T23:32:24.510 に答える