如果除了大小写之外的键是相同的,则组合散列键和值

时间:2015-09-11 18:40:49

标签: ruby

假设我有一个Ruby Hash,其中至少有两个键完全相同,例如:

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

有没有一种方法可以像键一样组合(除了它们的情况),这样生成的Hash可能看起来像这样?

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

谢谢!

4 个答案:

答案 0 :(得分:2)

您可以构建新的哈希:

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

答案 1 :(得分: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

答案 2 :(得分:0)

这是另外一种方法

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}

答案 3 :(得分:0)

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}