Я имею два (или больше) массивы с 12 целыми числами в каждом (соответствие значениям в течение каждого месяца). Все, что я хочу, должно добавить их вместе так, чтобы у меня был единый массив с суммированными значениями в течение каждого месяца. Вот пример с тремя значениями: [1,2,3] и [4,5,6] => [5,7,9]
Лучшее, которое я мог придумать, было:
[[1,2,3],[4,5,6]].transpose.map{|arr| arr.inject{|sum, element| sum+element}} #=> [5,7,9]
Существует ли лучший способ сделать это? Это просто кажется такой основной вещью хотеть сделать.
Вот транспонированная
версия, предложенная Анурагом:
[[1,2,3], [4,5,6]].transpose.map {|x| x.reduce(:+)}
Это будет работать с любым количеством массивов компонентов. reduce
и inject
являются синонимами, но reduce
, как мне кажется, более четко передает цель кода здесь ...
вот моя попытка использовать эту штуку в коде:
// ruby 1.9 syntax, too bad they didn't add a sum() function afaik
[1,2,3].zip([4,5,6]).map {|a| a.inject(:+)} # [5,7,9]
zip
возвращает [1,4]
, [2,5]
, [3,6]
, и карта суммирует каждый подмассив.