2012-11-30 18 views
27

Ich habe zwei Hashes ...Wie kombinieren einen Hash mit einem anderen Hash in Ruby

a = {:a => 5} 
b = {:b => 10} 

Ich möchte ...

c = {:a => 5,:b => 10} 

Wie kann ich Hash c erstellen?

+0

nur bekam es in irb – thefonso

+0

1.9.3p194: 001> hash1 = {: a => 5} = > {: a => 5} 1.9.3p194: 002> hash2 = {: b => 10} => {: b => 10} 1.9.3p194: 003> hash3 = hash1.merge (hash2) => {: a => 5,: b => 10} 1.9.3p194: 004> hash3 => {: a => 5,: b => 10} 1.9.3p194: 005> – thefonso

Antwort

51

Es ist ein ziemlich geradlinig Betrieb ist, wenn Sie nur die Verschachtelung:

c = a.merge(b) 

Wenn Sie tatsächlich fügen Sie die Werte zusammen, das wäre ein bisschen schwieriger, aber nicht unmöglich:

c = a.dup 
b.each do |k, v| 
    c[k] ||= 0 
    c[k] += v 
end 

Der Grund für a.dup ist zu vermeiden, die Werte in der a Hash zu vermischen, aber wenn Sie nicht kümmern, könnten Sie diesen Teil überspringen. Die ||= wird verwendet, um sicherzustellen, dass es mit einem Standardwert von 0 als nil + 1 nicht gültig ist.

19

die Dokumentation überprüfen können, wie alle sagen Sie Merge-Methode können Sie lösen Ihre Problem. Allerdings gibt es ein kleines Problem mit der Merge-Methode. Hier ist warum.

person1 = {"name" => "MarkZuckerberg", "company_name" => "Facebook", "job" => "CEO"} 

person2 = {"name" => "BillGates", "company_name" => "Microsoft", "position" => "Chairman"} 

Schauen Sie sich diese beiden Felder name und company_name an. Hier sind name und company_name in beiden Hashes identisch (ich meine die Schlüssel). Nächster Job und Position haben unterschiedliche Schlüssel.

Wenn Sie versuchen, zwei Hashes person1 und person2 zusammenzuführen Wenn die Schlüssel person1 und person2 gleich sind? dann überschreibt der Schlüsselwert person2 den Schlüsselwert peron1. Hier überschreibt der zweite Hash die ersten Hashfelder, weil beide gleich sind. Hier sind Name und Firmenname gleich. Sehen Sie das Ergebnis.

people = person1.merge(person2) 

Output: {"name"=>"BillGates", "company_name"=>"Microsoft", 
     "job"=>"CEO", "position"=>"Chairman"} 

Wenn Sie jedoch nicht wollen, dass Ihr zweiter Hash den ersten Hash überschreibt. Sie können

people = person1.merge(person2) {|key, old, new| old} 

    Output: {"name"=>"MarkZuckerberg", "company_name"=>"Facebook", 
      "job"=>"CEO", "position"=>"Chairman"} 

wie diese etwas tun, ist es nur eine kurze Notiz, wenn fusioniert mit()

+1

danke für die Aufnahme (mehr) vollständige Funktionalität der Zusammenführung in Ihrem Re sponse! :) +1 – Zackkenyon

+0

du bist mein Held für heute. Ich habe genau danach gesucht. –

+0

Kollisionen sind wichtig zu beachten! Aber deine Lösung ist die gleiche wie 'people = person2.merge (person1)', oder?Der Block ist in diesem Fall nicht notwendig, aber er ist nützlich, wenn Sie etwas komplizierter für Kollisionen machen wollen. Es ist auch nützlich für 'merge!' (Die destruktive Version). –