我有一个带整数值的哈希:
h = {
a: 1,
b: 1,
c: 1,
d: 2,
e: 2,
}
我需要将100
添加到第一个值,对于第二个值和on,我需要将前面的值添加到原始值以获取:
{
a: 101,
b: 102,
c: 103,
d: 105,
e: 107,
}
有没有一个很好的方法来实现这一目标?
您可以使用inject
来计算总和:
h = { a: 1, b: 1, c: 1, d: 2, e: 2}
h.inject(100) { |s, (k, v)| s + v }
#=> 107
在这样做的同时,您还可以设置哈希值以获得累积总和:
h.inject(100) { |s, (k, v)| h[k] = s + v }
h #=> {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
您可以将总和跟踪为外部变量:
sum = 100
h.transform_values{|v| sum += v} # => {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
不可修改输入的不可变解决方案:
h.each_with_object({sum: 100, outcome: {}}) do |(k, v), acc|
acc[:outcome][k] = acc[:sum] += v
end
#⇒ {:sum=>107, :outcome=>{:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}}
也许这不是最有效的解决方案,但它绝对美观可读。
accumulated_sum = 0
h.each do |key, value|
accumulated_sum += value
hash[key] = 100 + accumulated_sum
end