web-dev-qa-db-ja.com

Ruby-配列をハッシュマップにマッピング

配列と、値を指定して値を返す関数があります。最終的には、キー値として配列の値を持ち、値としてf(key_value)の結果を持つハッシュマップを作成します。ブロックを使用してこれを行う、配列の各/マップと同様の、クリーンでシンプルな方法はありますか?

ので、同等のもの

hsh = {}
[1,2,3,4].each do |x|
  hsh[x] = f(x)
end

しかし、これはよりシンプルで、1行であるという点で似ていますか?

results = array.map { | x | f(x) }
51
Ji Mun

また、関数をハッシュのデフォルト値として定義することもできます。

hash = Hash.new {|hash, key| hash[key] = f(key) }

その後、値をルックアップすると、ハッシュが計算してその場で保存します。

hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
28
Zach Kemp

Ruby 2.1.0から Array#to_h も使用できることに注意してください。

[1,2,3,4].map{ |x| [x, f(x)] }.to_h
106
Knotty66

each_with_objectが必要です。

def f x
  x * 2
end

t = [1, 2, 3, 4].each_with_object({}) do |x, memo|
  memo[x] = f(x)
end

t # => {1=>2, 2=>4, 3=>6, 4=>8}

もう一つ:

t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
22

Hash :: [] メソッドを確認してください。

Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
21
Matt Huggins

ファセットの使用 mash (enumerableをハッシュに変換する方法):

[1, 2, 3, 4].mash { |x| [x, f(x)] }

From Ruby 2.1:

[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
8
tokland

Ruby 2.6.0では、 to_h- methodにブロックを渡す が有効になります。これにより、配列からハッシュを作成するためのさらに短い構文が可能になります。

[1, 2, 3, 4].to_h { |x| [x, f(x)] }
6
Timitry

あなたが探している reduce()|inject() method

_elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
  res[x] = x**2
  res
end

puts h
_

reduce({})に渡される引数は、res変数としてブロックに渡される中間オブジェクトの初期値です。各反復で、新しいペア_key: value_をresハッシュに追加し、次の反復で使用されるようにハッシュを再調整します。

上記の方法は、2乗値の非常に実用的なハッシュを事前計算します。

_{1=>1, 2=>4, 3=>9, 4=>16}
_
0
Tombart