3

我有一个带有 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 中怎么可能?

4

5 回答 5

3

是的,这在 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]
于 2013-05-02T13:50:41.197 回答
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]]

由于sumnil在第一次迭代中,因此有必要调用to_i它。

于 2013-05-02T13:57:19.167 回答
2
a = [['some_date1', 1], ['some_date2', 3], ['some_date3', 5], ['some_date4', 7]]
a.each_cons(2){|a1, a2| a2[1] += a1[1]}
于 2013-05-02T14:37:17.987 回答
1
last = 0
arr.map do |a, b|
  last = last + b
  [a, last]
end
于 2013-05-02T13:48:44.643 回答
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返回一个值,但它在没有赋值的情况下被丢弃。

于 2013-05-02T14:13:43.493 回答