添加多维数组的值

时间:2016-01-30 18:59:43

标签: arrays ruby multidimensional-array

我正在使用图表数据。我有三组来自三个来源的数据,我试图将他们的年份添加到新的一起。在我的例子中,年份是0,1,2。

视觉:

data = [[[year, value], [year, value], [year, value]],
       [[year, value], [year, value], [year, value]],
       [[year, value], [year, value], [year, value]]]

以下是实际数据的示例:

data = [[[0, 1], [1, 2], [2, 3]],
       [[0, 4], [1, 5], [2, 6]],
       [[0, 7], [1, 8], [2, 9]]]

我试图获得以下结果:

data = [[0, 12], [1, 15], [2, 18]]

为了增加复杂性,它不会总是三组数据,可能是一组或十二组,任何数字。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:4)

<强>解决方案

data.map(&:to_h).reduce({}) {|memo, h| memo.merge(h) {|_,v1,v2| v1 + v2} }.to_a

<强>解释

步骤1:将数据数组转换为哈希数组

data_hash = data.map(&:to_h)
#=> [{0=>1, 1=>2, 2=>3}, {0=>4, 1=>5, 2=>6}, {0=>7, 1=>8, 2=>9}]

步骤2:通过将每个散列相互合并来减少散列数组,同时确保为给定键添加值。

reduced_hash = data_hash.reduce({}) {|memo, h| memo.merge(h) {|_,v1,v2| v1 + v2} }  
#=> {0=>12, 1=>15, 2=>18}

我们使用空哈希{}作为memo的初始值,并将data_hash数组中存在的每个哈希值合并 - merge的块将确保正在合并密钥,它的值会相加,以便最终得到该密钥的所有值的总和

步骤3:在哈希上使用to_a来获取数组结果

 reduced_hash.to_a
 #=> [[0, 12], [1, 15], [2, 18]]