Вы можете сделать это так:
(a + b).group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] }
Сначала вы складываете массивы вместе с +
, так как вас не волнуют a
и b
, вы просто заботитесь об их элементах. Затем group_by
разделяет объединенный массив по первому элементу, так что с внутренними массивами можно легко работать. Тогда вам просто нужно вытащить вторые (или последние) элементы внутренних массивов с помощью v.map(&:last)
и сложить их с inject(:+)
.
Например:
>> a = [[1,10],[2,20],[3,30]]
>> b = [[1,50],[3,70]]
>> (a + b).group_by(&:first).map { |k,v| [k, v.map(&:last).inject(:+)] }
=> [[1, 60], [2, 20], [3, 100]]