0

我有一个包含许多记录的 JSON,对于这个问题,我们假设为 100。有两个键,Change 和 Sign。变化类似于 0.14,符号是“+”或“-”两个符号之一。

对于每条记录,我想再添加两个键“总共 20 条记录”和“总共 20 条记录”。其中这些等于符号分别为“+”和“-”的最后 20 条记录的总和。

因此,对于“总共 20 条记录”,例如:

array.collect {|array| array['change']}
array.collect {|array| array['sign']} 
if sign = "+" then
#store change in uparray
#when uparray has 20 records add it up and create variable 20recorduptotal

任何帮助表示赞赏。非常感谢

我相信我需要使用 .each_cons(20) 但只有带有适用符号的记录。

4

1 回答 1

0

更新:这里的东西可能真的有效:)

我定义了一个“求和队列”,它计算添加到其中的最后 20 个项目的总和。如果少于 20 个项目,则sum返回。nil

class SummingQueue
  def initialize(length = 20)
    @values = []
    @sum = 0
    @length = length
  end

  def <<(value)
    @values << value
    @sum += value
    @sum -= @values.shift if @values.length > @length
  end

  def sum
    return nil if @values.length < @length
    @sum
  end
end

queues = Hash.new {|hash, key| hash[key] = SummingQueue.new }

array.each do |item|
  queues[item["sign"]] << item["change"]
  item["last_20_ups"] = queues["+"].sum
  item["last_20_downs"] = queues["-"].sum
end

请注意,last_20_ups将包括当前值(如果适用) - 如果您希望它是包括当前值的最后 20 个值,则将该queues[...] << item[...]行移动到each块的末尾。

于 2012-11-19T19:51:38.210 回答