web-dev-qa-db-fra.com

Ruby - mapper un tableau en hashmap

J'ai un tableau et une fonction qui renvoie une valeur à partir d'une valeur. En fin de compte, je souhaite créer une table de hachage ayant les valeurs du tableau comme valeur de clé et le résultat de f (valeur_clé) comme valeur. Existe-t-il un moyen simple et propre, semblable à chaque carte d’Array, de le faire en utilisant un bloc? 

Donc, quelque chose qui équivaut à

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

mais ressemble plus à cela, en ce sens que c'est simple et une ligne? 

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

Vous pouvez également définir la fonction comme valeur par défaut du hash:

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

Ensuite, lorsque vous recherchez une valeur, le hachage la calcule et la stocke à la volée.

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

Notez que depuis Ruby 2.1.0, vous pouvez aussi utiliser Array # to_h , comme ceci:

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

Découvrez la méthode Hash :: [] .

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

Vous avez besoin de 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}

Un autre:

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

Utilisation de Facets ' mash (méthode pour convertir enumerable en hashes):

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

De Ruby 2.1:

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

Ruby 2.6.0 permet de passer un bloc à la méthode to_h- . Cela permet une syntaxe encore plus courte pour créer un hachage à partir d'un tableau:

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

Vous recherchez reduce()|inject(), méthode :

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

puts h

L'argument transmis à reduce({}) est la valeur initiale d'un objet intermédiaire transmis au bloc en tant que variable res. À chaque itération, nous ajoutons une nouvelle paire key: value au hachage res et retenons le hachage pour qu'il soit utilisé lors de la prochaine itération. 

La méthode ci-dessus calcule un hachage très pratique de valeurs carrées:

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