web-dev-qa-db-ja.com

rubyで1つのハッシュを別のハッシュと組み合わせる方法

ハッシュが2つあります...

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

が欲しいです...

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

ハッシュcを作成するにはどうすればよいですか?

36
thefonso

インターリーブしている場合は、非常に簡単な操作です。

c = a.merge(b)

実際に値を加算したい場合、これは少し複雑になりますが、不可能ではありません。

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

の理由 a.dupaハッシュの値をマングルすることを避けるためですが、気にしない場合はその部分をスキップできます。 ||=を使用して、デフォルトの0 as nil + 1 有効ではない。

63
tadman

みんなが言っているように、あなたはあなたの問題を解決するためにマージ方法を使うことができます。ただし、マージ方法の使用には若干の問題があります。その理由は次のとおりです。

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

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

これら2つのフィールドの名前とcompany_nameを見てください。ここで、nameとcompany_nameは両方とも2つのハッシュで同じです(キーを意味します)。次の仕事と役職には異なるキーがあります。

2つのハッシュperson1とperson2をマージしようとすると、person1とperson2のキーが同じ場合次に、person2キー値がperon1キー値をオーバーライドします。ここでは、両方が同じであるため、2番目のハッシュが最初のハッシュフィールドをオーバーライドします。ここで、名前と会社名は同じです。結果をご覧ください。

people  = person1.merge(person2)

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

ただし、2番目のハッシュで最初のハッシュを上書きしたくない場合。このようなことができます

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

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

Merge()を使用するときの簡単なメモです

21
Prabhakar

欲しいと思う

c = a.merge(b)

http://www.Ruby-doc.org/core-1.9.3/Hash.html#method-i-merge でドキュメントをチェックアウトできます。

7
Andbdrew

マージ方法を使用:

c = a.merge b
2
jboursiquot