私は文字列の配列を持っていて、そこからハッシュを作りたい。配列の各要素がキーになり、そのキーから計算される値にしたいと思います。これを行うRubyの方法はありますか?例えばRuby配列をハッシュする:各要素のキーとそれから値を派生させる
:
['a','b']
{'a'=>'A','b'=>'B'}
私は文字列の配列を持っていて、そこからハッシュを作りたい。配列の各要素がキーになり、そのキーから計算される値にしたいと思います。これを行うRubyの方法はありますか?例えばRuby配列をハッシュする:各要素のキーとそれから値を派生させる
:
['a','b']
{'a'=>'A','b'=>'B'}
次のことができます。
a = ['a', 'b']
Hash[a.map {|v| [v,v.upcase]}]
これは確かに動作します...しかし、私はそれが* most *効率的だとは思わない...あなたはこの場合2回反復しています。もちろん、長さ2の配列には関心がありませんが、注意する価値はあります。 – brad
に変換するためにここでキーとして使用するシンボルに現在の文字を変換素朴でシンプルなソリューションです。そしてちょうど楽しみのためにそれは価値を大文字にします。あなたは
def theFunk(array)
hash = {}
array.each do |x|
hash[x] = x.upcase
end
hash
end
p theFunk ['a', 'b', 'c'] # prints {"a"=>"A", "b"=>"B", "c"=>"C"}
わかりませんそれを見て、最初の配列を反復する必要があります。ここでは別の方法です:
a = ['a', 'b', 'c']
h = Hash[a.collect {|v| [v, v.upcase]}]
#=> {"a"=>"A", "b"=>"B", "c"=>"C"}
どちらこれまでの方法:
hash = {}
['a', 'b'].each do |x|
hash[x] = x.upcase
end
p hash # prints {"a"=>"A", "b"=>"B"}
機能として、我々はこれを持っているでしょう:これは本当のRubyの方法ですが、十分に近いはずである場合:)
h = Hash.new
['a', 'b'].each {|a| h[a.to_sym] = a.upcase}
puts h
# => {:a=>"A", :b=>"B"}
%w{a b c}.reduce({}){|a,v| a[v] = v.upcase; a}
私はあなたのソリューションが好きです!非常に滑らか! –
ここでは別の方法です:
a.zip(a.map(&:upcase)).to_h
#=>{"a"=>"A", "b"=>"B"}
Rubyのeach_with_object
方法は、あなたが
['a', 'b'].each_with_object({}) { |k, h| h[k] = k.upcase }
文字列は一意ですか?もしそうでないなら、どうしますか?例外が欲しいですか? –
はい、それらは一意になります。もしそうでなければ、私はその前にuniqをするでしょう。 – lulalala