si potrebbe fare così:
(a + b).group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] }
Prima di mettere gli array insieme a +
dato che non ti importa di a
e b
, ti interessano solo i loro elementi. Quindi la group_by
partiziona l'array combinato dal primo elemento in modo che gli array interni possano essere facilmente lavorati con. Quindi devi solo estrarre i secondi (o ultimi) elementi degli array interni con v.map(&:last)
e sommarli con inject(:+)
.
Ad esempio:
>> 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]]
fonte
2012-02-17 19:00:28
Ho provato con Array # assoc ma mi rifugio stati in grado di farlo bene. – Agush