Ich habe ein Array und eine Funktion, die einen bestimmten Wert zurückgibt. Letztendlich möchte ich eine Hashmap erstellen, die die Werte des Arrays als Schlüsselwert und das Ergebnis von f (key_value) als Wert enthält. Gibt es einen sauberen, einfachen Weg, wie in jeder/Karte von Array, dies mit Hilfe eines Blocks zu tun?
Also etwas, das äquivalent ist
hsh = {}
[1,2,3,4].each do |x|
hsh[x] = f(x)
end
sieht aber eher so aus, dass es einfach ist und eine Zeile?
results = array.map { | x | f(x) }
Sie können die Funktion auch als Standardwert des Hash definieren:
hash = Hash.new {|hash, key| hash[key] = f(key) }
Wenn Sie nach einem Wert suchen, berechnet und speichert der Hash ihn im laufenden Betrieb.
hash[10]
hash.inspect #=> { 10 => whatever_the_result_is }
Beachten Sie, dass Sie seit Ruby 2.1.0 auch Array # to_h verwenden können, wie folgt:
[1,2,3,4].map{ |x| [x, f(x)] }.to_h
Schauen Sie sich die Hash :: [] -Methode an.
Hash[ [1,2,3,4].collect { |x| [x, f(x)] } ]
Sie benötigen 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}
Noch einer:
t2 = [1, 2, 3, 4].map{|x| [x, f(x)]}
Hash[t2] # => {1=>2, 2=>4, 3=>6, 4=>8}
Verwenden von Facets ' mash (Methode zum Konvertieren von Aufzählungszeichen in Hashes):
[1, 2, 3, 4].mash { |x| [x, f(x)] }
Ab Ruby 2.1:
[1, 2, 3, 4].map { |x| [x, f(x)] }.to_h
Ruby 2.6.0 aktiviert das Übergeben eines Blocks an die to_h
- Methode . Dies ermöglicht eine noch kürzere Syntax zum Erstellen eines Hash aus einem Array:
[1, 2, 3, 4].to_h { |x| [x, f(x)] }
Sie suchen nach der reduce()|inject()
Methode :
elem = [1,2,3,4]
h = elem.reduce({}) do |res, x|
res[x] = x**2
res
end
puts h
Das an reduce({})
übergebene Argument ist der Anfangswert eines Zwischenobjekts, das als res
-Variable an den Block übergeben wird. In jeder Iteration fügen wir dem res
-Hash ein neues Paar key: value
hinzu und nehmen den Hash für die nächste Iteration zurück.
Die obige Methode berechnet einen sehr praktischen Hash von Quadratwerten:
{1=>1, 2=>4, 3=>9, 4=>16}