52

我有两个哈希...

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

我想...

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

如何创建哈希 c?

4

4 回答 4

77

如果您只是交错,这是一个非常简单的操作:

c = a.merge(b)

如果您想实际将这些值相加,这会有点棘手,但并非不可能:

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

的原因a.dup是为了避免破坏a散列中的值,但是如果您不在乎,可以跳过该部分。||=用于确保它以默认值0as开头nil + 1是无效的。

于 2012-11-30T23:16:54.910 回答
31

(TL;DR hash1.merge(hash2):)

正如大家所说,您可以使用合并方法来解决您的问题。但是,使用合并方法存在一些问题。这就是为什么。

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

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

看看这两个字段 name 和 company_name。这里的 name 和 company_name 在两个哈希中都是相同的(我的意思是键)。下一份工作和职位有不同的关键。

当您尝试合并两个哈希 person1 和 person2 如果 person1 和 person2 键相同?那么 person2 键值将覆盖 peron1 键值。在这里,第二个哈希将覆盖第一个哈希字段,因为两者是相同的。这里名称和公司名称相同。查看结果。

people  = person1.merge(person2)

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

但是,如果您不希望您的第二个哈希覆盖第一个哈希。你可以做这样的事情

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

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

这只是使用 merge() 时的快速说明

于 2014-12-15T11:57:53.857 回答
11

我想你想要

c = a.merge(b)

您可以在http://www.ruby-doc.org/core-1.9.3/Hash.html#method-i-merge查看文档

于 2012-11-30T23:18:20.280 回答
1

使用合并方法:

c = a.merge b
于 2012-11-30T23:17:11.633 回答