我有一个带x和y值的数组:
[[some_date1, 1], [some_date2, 3], [some_date3, 5], [some_date4, 7]]
结果应该只对y
值(1,3,5,7)求和,以便结果如下:
[[some_date1, 1], [some_date2, 4], [some_date3, 9], [some_date4, 16]]
这在Ruby中怎么可能?
答案 0 :(得分:3)
是的,这在Ruby中是可行的。您可以使用[map][1]
并执行以下操作:
sum = 0
array.map {|x,y| [x, (sum+=y)]}
这是它的工作原理。对于给定的输入:
array = ["one", 1], ["two", 2]
它将遍历数组中的每个元素,例如)第一个元素是["one", 1]
。
然后它将获取该元素(这是一个数组本身)并将变量x分配给该数组中的第一个元素,例如{}} {}和y到第二个例如{} "one"
。
最后,它将返回一个结果如下的数组:
1
答案 1 :(得分:3)
您可以使用map:
a = [[:some_date1, 1], [:some_date2, 3], [:some_date3, 5], [:some_date4, 7]]
sum = 0
a.map { |f, v| [f, (sum = sum + v)]}
=> [[:some_date1, 1], [:some_date2, 4], [:some_date3, 9], [:some_date4, 16]]
由于sum
在第一次迭代中为nil
,因此需要在其上调用to_i
。
答案 2 :(得分:2)
a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}
答案 3 :(得分:1)
last = 0
arr.map do |a, b|
last = last + b
[a, last]
end
答案 4 :(得分:1)
我会用:
ary = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
ary.inject(0) { |m, a|
m += a[-1]
a[-1] = m
}
运行后,ary
为:
[["some_date1", 1], ["some_date2", 4], ["some_date3", 9], ["some_date4", 16]]
我更喜欢这个的原因是它不需要添加累加器变量。 inject
返回一个值,但在没有赋值的情况下它会被丢弃。