【发布时间】:2015-09-11 18:40:48
【问题描述】:
假设我有一个 Ruby 哈希,其中至少两个键是相同的,除了它们的情况,例如:
{ 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
有没有一种方法可以组合类似的键(除了它们的情况),使得生成的哈希看起来像这样?
{ 'foo' => 3, 'bar' => 3 }
谢谢!
【问题讨论】:
标签: ruby
假设我有一个 Ruby 哈希,其中至少两个键是相同的,除了它们的情况,例如:
{ 'Foo' => 1, 'foo' => 2, 'bar' => 3 }
有没有一种方法可以组合类似的键(除了它们的情况),使得生成的哈希看起来像这样?
{ 'foo' => 3, 'bar' => 3 }
谢谢!
【问题讨论】:
标签: ruby
你可以建立一个新的哈希:
new_hash = Hash.new(0)
old_hash.each_pair { |k, v| new_hash[k.downcase] += v }
【讨论】:
Hash.new 确实简化了事情 - 将新键的默认值设置为 0 真的很有帮助。谢谢!
您可以使用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
【讨论】:
这是另一种方法
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}
【讨论】:
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}
【讨论】: