【问题标题】:How to combine one hash with another hash in ruby如何在 ruby​​ 中将一个哈希与另一个哈希结合起来
【发布时间】:2012-11-19 05:24:34
【问题描述】:

我有两个哈希...

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

我想要……

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

如何创建哈希 c?

【问题讨论】:

  • 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 >

标签: ruby hashmap


【解决方案1】:

(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() 时的一个快速说明

【讨论】:

  • 感谢您在回复中包含(更多)完整的合并功能! :) +1
  • 你是我今天的英雄。我正是在寻找这个。
  • 碰撞是需要考虑的重要因素!但是您的解决方案与people = person2.merge(person1) 相同,对吗?在这种情况下,该块是不必要的,但如果您想为碰撞做一些更复杂的事情,它会很有用。对于merge!(破坏性版本)也很有用。
  • TL;DR 奖励!
【解决方案2】:

我想你想要

c = a.merge(b)

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

【讨论】:

    【解决方案3】:

    使用合并方法:

    c = a.merge b
    

    【讨论】:

      【解决方案4】:

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

      c = a.merge(b)
      

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

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-07-15
        • 1970-01-01
        • 2012-03-24
        • 2014-03-30
        • 2013-07-21
        • 1970-01-01
        • 2020-02-20
        相关资源
        最近更新 更多