假设我有一个Ruby Hash,其中至少有两个键完全相同,例如:
{ 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
有没有一种方法可以像键一样组合(除了它们的情况),这样生成的Hash可能看起来像这样?
{ 'foo' => 3, 'bar' => 3 }
谢谢!
答案 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]
将等于nil
和nil.to_i #=> 0
。另一方面,如果g
有一个键e
,h[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}