Объединить или сложить 2 массива на «ключах» в ruby - PullRequest
7 голосов
/ 17 февраля 2012

Это версия массива: Сумма 2 атрибутов хэша с тем же ключом

У меня есть 2 массива, например:

a = [[1,10],[2,20],[3,30]]
b = [[1,50],[3,70]]

Как я могуСуммируйте каждое по первому значению (если оно существует), чтобы получить:

c = [[1,60],[2,20],[3,100]]

Ответы [ 2 ]

11 голосов
/ 17 февраля 2012

Вы можете сделать это так:

(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]]
10 голосов
/ 17 февраля 2012

Вы также можете сделать это способ хэширования :

Hash[a].merge(Hash[b]){|k,a,b|a+b}.to_a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...