Добавить предыдущее значение к каждому значению хеша - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть хэш с целочисленными значениями:

h = {
  a: 1,
  b: 1,
  c: 1,
  d: 2,
  e: 2,
}

Мне нужно добавить 100 к первому значению, а для второго значения и далее мне нужно добавить предыдущее значение к исходномузначение, которое нужно получить:

{
  a: 101,
  b: 102,
  c: 103,
  d: 105,
  e: 107,
}

Есть ли хороший способ добиться этого?

Ответы [ 4 ]

0 голосов
/ 19 февраля 2019

Неизменное решение, которое не изменяет ввод:

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}}
0 голосов
/ 19 февраля 2019

Возможно, это не самое эффективное решение, но оно определенно приятно и читабельно.

accumulated_sum = 0
h.each do |key, value|
  accumulated_sum += value
  hash[key] = 100 + accumulated_sum
end
0 голосов
/ 19 февраля 2019

Вы можете просто отслеживать сумму как внешнюю переменную:

sum = 100
h.transform_values{|v| sum += v} # => {:a=>101, :b=>102, :c=>103, :d=>105, :e=>107}
0 голосов
/ 19 февраля 2019

Вы можете использовать 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...