我有一个带有 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 中怎么可能?
我有一个带有 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 中怎么可能?
是的,这在 Ruby 中是可能的。您可以使用[map][1]
并执行以下操作:
sum = 0
array.map {|x,y| [x, (sum+=y)]}
这就是它的工作原理。对于给定的输入:
array = ["one", 1], ["two", 2]
它将遍历数组中的每个元素,例如)第一个元素是["one", 1]
.
然后它将获取该元素(它本身是一个数组)并将变量 x 分配给该数组中的第一个元素 eg)"one"
并将 y 分配给第二个元素 eg) 1
。
最后,它将返回一个数组,其结果如下:
=> ["one", 1], ["two", 3]
您可以使用地图:
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
它。
a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}
last = 0
arr.map do |a, b|
last = last + b
[a, last]
end
我会使用:
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
返回一个值,但它在没有赋值的情况下被丢弃。