2016-08-06 46 views
-4

Wenn ich einen Hash wie der unten habe, und ich möchte über die Tasten der zweiten Ebene Schleife.Wie wird innerhalb eines Hashes geloopt?

Warum schlägt das fehl?

hash["Element"].each do |id| 
    h[id] = hash[id]["Name"] 
end 

Hash

{ 
    "Element" => { 
     "499723" => { 
         "Name" => "A", 
     }, 
     "499725" => { 
         "Name" => "B", 
    }, 
} 
+0

Sie Stimmen auf Ihre Frage bekommen, weil diese durch das Lesen herausgefunden haben könnte [die Dokumentation] (http: // ruby-doc. org/core-2.3.1/Hash.html # method-i-each) für Hash's 'each'. "[Wie viel Forschungsaufwand wird von Stack Overflow-Benutzern erwartet?] (Http://meta.stackoverflow.com/q/261592/128421)" wird erklären, warum. –

Antwort

2

Es weil .each auf einem Hash fehl ergibt das Tupel von Schlüssel und Wert.

hash = { 
    "Element" => { 
    "499723" => { 
     "Name" => "A", 
    }, 
    "499725" => { 
     "Name" => "B", 
    }, 
    } 
} 

hash["Element"].each do |id| 
    p id 
end 

["499723", {"Name"=>"A"}] 
["499725", {"Name"=>"B"}] 

Daher müssen Sie

hash["Element"].each do |id, value| 
    # ... 
end 

verwenden Wenn Sie den Wert

hash["Element"].each do |id, _| 
    # ... 
end 

jedoch nicht benötigen, können Sie den Wert halten und den Zugang direkt

hash["Element"].each do |id, value| 
    h[id] = value["Name"] 
end 

Eine einfache Lösung in Ihrem Fall ist Enumberable#each_with_object in Kombination mit der vorherigen Informationen zu verwenden:

hash["Element"].each_with_object({}) do |(id, value), acc| 
    acc[id] = value["Name"] 
end 

# => {"499723"=>"A", "499725"=>"B"} 
+0

Wann würde ich das letzte Beispiel verwenden wollen, das Sie angegeben haben, verglichen mit dem vorletzten, das weniger Tipparbeit erfordert? –

+1

In Ihrem ursprünglichen Beispiel haben Sie einen Akkumulator 'h' verwendet, um den zurückgegebenen Wert zu speichern. Du hast es nicht in deine Frage aufgenommen. Die letzte Version, die ich vorgeschlagen habe, benötigt keine zusätzliche Variable als Akkumulator. Die Menge an "Tippen" ist nicht immer ein Maß für guten Code. –

+0

Sehr schön! Vielen Dank. –

1
hash["Element"].each.with_object({}) do |(id, subhash), result| 
    result[id] = subhash["Name"] 
end