我正在使用多个数组,每个数组都有一个字符串和多个整数。我已经设法将嵌套数组中的重复项设置在一起,因为我想要将它们组合在一起。因此,当我遍历我的父数组时,它会输出:
[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]]
和另一个例子:
[["without", 1, 1, 3, 4], ["without", 2, 1, 3, 4], ["without", 3, 1, 0, 0]]
我想要一个函数将这些组合成一个数组并求和整数。所以上面的第一个例子将成为:
["word", 3, 2, 6, 8]
我尝试过很多不同的技术,比如注入和减少。我最近的尝试并不是最优雅的:
# data is set of array
def inject_array(data)
clicks = 0
imps = 0
cost = 0
converted_clicks = 0
data.each do |i|
clicks += i[1]
i[1] = clicks
imps += i[2]
i[2] = imps
cost += i[3]
i[3] = cost
converted_clicks += i[4]
i[4] = converted_clicks
end
它变得有点凌乱,有更清洁的方式吗?
答案 0 :(得分:4)
假设数组的长度始终相同,您可以使用Array#transpose
将数组数组从基于行的数组转换为基于列的数组:
[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]].transpose
=> [["word", "word"], [1, 2], [1, 1], [3, 3], [4, 4]]
从那里开始,对每个数字进行求和是非常微不足道的:
[["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]].transpose.map.with_index do |e, i|
i == 0 ? e.first : e.inject(:+)
end # => ["word", 3, 2, 6, 8]
答案 1 :(得分:0)
您还可以使用班级Matrix的方法。回想一下,要将矩阵的每一列与r
行相加,请将矩阵乘以由r
1
s组成的行向量:
require 'matrix'
a = [["word", 1, 1, 3, 4], ["word", 2, 1, 3, 4]]
[a.first.first, (Matrix[[1]*a.size] * Matrix[*a.map { |e| e[1..-1] }]).to_a.first]
#=> ["word", [3, 2, 6, 8]]
答案 2 :(得分:0)
一种方法是遍历数组,对部分求和,然后重建。
word_array = [['word', 1, 1, 3, 4], ['word', 2, 1, 3, 4]]
puts "Squashing #{word_array}..."
i1 = 0
i2 = 0
i3 = 0
i4 = 0
word_array.each do |arr|
i1 += arr[1]
i2 += arr[2]
i3 += arr[3]
i4 += arr[4]
end
puts ['word', i1, i2, i3, i4].inspect