【问题标题】:Combine hash keys and values if keys are identical except for case如果除了大小写之外键相同,则组合散列键和值
【发布时间】:2015-09-11 18:40:48
【问题描述】:

假设我有一个 Ruby 哈希,其中至少两个键是相同的,除了它们的情况,例如:

{ 'Foo' => 1, 'foo' => 2, 'bar' => 3 }

有没有一种方法可以组合类似的键(除了它们的情况),使得生成的哈希看起来像这样?

{ 'foo' => 3, 'bar' => 3 }

谢谢!

【问题讨论】:

    标签: ruby


    【解决方案1】:

    你可以建立一个新的哈希:

    new_hash = Hash.new(0)
    old_hash.each_pair { |k, v| new_hash[k.downcase] += v }
    

    【讨论】:

    • Hash.new 确实简化了事情 - 将新键的默认值设置为 0 真的很有帮助。谢谢!
    【解决方案2】:

    您可以使用inject 循环所有哈希项并构建一个新的哈希。

    hash = { 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
    hash.inject({}) do |result, (key, value)|
      key = key.downcase
      result[key] = result[key] ? result[key] + value : value
      result
    end
    

    【讨论】:

      【解决方案3】:

      这是另一种方法

      h = { 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
      p h.collect{|k, v| {k.downcase => v}}.reduce { |a, v| a.update(v) {|k, o, n| o + n } }
      #=> {"foo"=>3, "bar"=>3}
      

      【讨论】:

        【解决方案4】:
        h = { 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
        
        h.each_with_object({}) { |(k,v),g| g[k.downcase] = g[k.downcase].to_i + v }
          #=> {"foo"=>3, "bar"=>3} 
        

        这利用了这样一个事实,即如果g 没有密钥e,右侧的g[e] 将等于nilnil.to_i #=> 0。另一方面,如果g 有一个键eh[e].to_i 将等于h[e]

        另一种方式:

        h.each_with_object({}) { |(k,v),g| g.update(k.downcase=>v) { |_,o,v| o+v } }
          #=> {"foo"=>3, "bar"=>3} 
        

        【讨论】:

          猜你喜欢
          • 2019-05-07
          • 1970-01-01
          • 2013-02-24
          • 2014-11-21
          • 1970-01-01
          • 1970-01-01
          • 2018-06-17
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多