在ruby中的"键"上合并或求和2个数组

Agu*_*ush 7 ruby arrays sum

这是数组版本:Sum 2哈希属性具有相同的键

我有2个数组,例如:

a = [[1,10],[2,20],[3,30]]
b = [[1,50],[3,70]]
Run Code Online (Sandbox Code Playgroud)

如何在第一个值(如果存在)上对每个值求和:

c = [[1,60],[2,20],[3,100]]
Run Code Online (Sandbox Code Playgroud)

mu *_*ort 11

你可以这样做:

(a + b).group_by(&:first).map { |k, v| [k, v.map(&:last).inject(:+)] }
Run Code Online (Sandbox Code Playgroud)

首先,你把数组连同+因为你不关心ab,你只关心自己的元素.然后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]]
Run Code Online (Sandbox Code Playgroud)

  • 很好的一个班轮,加上它如何工作的一个很好的解释,谢谢. (2认同)

alf*_*alf 10

您也可以使用哈希方式:

Hash[a].merge(Hash[b]){|k,a,b|a+b}.to_a
Run Code Online (Sandbox Code Playgroud)

  • 在这种特殊情况下,`Hash [*a.flatten]`和`Hash [a]`是一样的,只有后者才更快. (2认同)