Как суммировать значения внутри массива хэша с одинаковыми ключами - PullRequest
0 голосов
/ 27 февраля 2019

Я хочу суммировать значения таких же ключей, как

arr = [{"69120090" => [1, 2, 3]}, {"69120090" => [4, 5, 6]}]

Мне нужно получить:

result = [{"69120090" => [5, 7, 9]}]

Ответы [ 2 ]

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

Просто чтобы иметь другой вариант, учитывая массив:

arr = [{ a: [1, 2, 3], b:[8,9,0] }, { a: [4, 5, 6], c: [1,2,3] }, { b: [0,1,2], c: [1,2,3] } ]

Вы можете написать:

tmp = Hash.new{ |k,v| k[v] = [] }
arr.each { |h| h.each { |k,v| tmp[k] << v } }
tmp.transform_values { |k| k.transpose.map(&:sum) }

, который возвращает

tmp #=> {:a=>[5, 7, 9], :b=>[8, 10, 2], :c=>[2, 4, 6]}


Какодин лайнер:
(arr.each_with_object(Hash.new{ |k,v| k[v] = [] }) { |h, tmp| h.each { |k,v| tmp[k] << v } }).transform_values { |k| k.transpose.map(&:sum) }
0 голосов
/ 27 февраля 2019

Уменьшить на Hash#merge! с помощью блока:

arr = [{"69120090"=> [1, 2, 3] }, {"69120090"=> [4, 5, 6] }]
arr.each_with_object({}) do |h, acc|
  acc.merge!(h) { |_, v1, v2| v1.zip(v2).map(&:sum) }
end
#⇒ {"69120090"=>[5, 7, 9]}

Вышеприведенное допускает любое количество хэшей с любым количеством ключей в каждом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...