Hash/Ruby - 选择哈希中的最后 4 个值(求平均值)

Spa*_*s38 2 ruby hash ruby-on-rails

我有一个哈希,我选择仪表板的所有数据来显示性能,因为显示最新值并不总是有帮助,所以我尝试从哈希中选择最后 4 个值。

我已经尝试过thing.last(4),但没有成功。

代码如下,主要是尝试显示 的最后 4 个点top_points或平均点。

注:红宝石1.9

metric.sort.each do |key, value|
  top_point = { x: Time.parse(key).to_time.to_i, y: value['top_10'] }
  top_points << top_point

  average_point = { x: Time.parse(key).to_time.to_i, y: value['average'] }
  average_points << average_point
end
Run Code Online (Sandbox Code Playgroud)

Car*_*and 5

下面使用Hash#select来避免将哈希转换为数组、操作数组然后将其转换回哈希的需要。

h = { "b"=>1, "d"=>6, "f"=>3, "e"=>1, "c"=>3, "a"=>7 }
Run Code Online (Sandbox Code Playgroud)
sz = h.size
  #=> 6
h.select { (sz -= 1) < 4 }
  #=> {"f"=>3, "e"=>1, "c"=>3, "a"=>7} 
Run Code Online (Sandbox Code Playgroud)

或者,如果使用 Ruby 2.5+,可以使用Hash#slice

h.slice(*h.keys[-4..-1])
  #=> {"f"=>3, "e"=>1, "c"=>3, "a"=>7}
Run Code Online (Sandbox Code Playgroud)

如果使用 Ruby 2.6+,则可以使用Endless range

h.slice(*h.keys[-4..])
  #=> {"f"=>3, "e"=>1, "c"=>3, "a"=>7}
Run Code Online (Sandbox Code Playgroud)