2012-02-17 9 views

risposta

11

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]] 
+2

Bello un rivestimento, oltre a una buona spiegazione di come funziona, grazie. – Agush

8

Si può anche farlo il modo hash:

Hash[a].merge(Hash[b]){|k,a,b|a+b}.to_a 
+2

In questo caso particolare "Hash [* a.flatten]" è la stessa cosa di "Hash [a]", presumo solo che quest'ultimo sia più veloce. –

+0

Grazie! Hai ragione. Ho modificato la risposta – alf

+0

Naturalmente, non pensavo di fonderli in hash, gracias! – Agush

Problemi correlati