我有一个哈希,我选择仪表板的所有数据来显示性能,因为显示最新值并不总是有用,我试图从哈希中选择最后4个值。
我尝试了thing.last(4)
,但无济于事。
代码如下,主要是尝试显示top_points
中的最后4个或平均点数。
注意:Ruby 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
答案 0 :(得分:3)
以下使用Hash#select来避免将哈希值转换为数组,操纵数组然后将其转换回哈希值。
h = { "b"=>1, "d"=>6, "f"=>3, "e"=>1, "c"=>3, "a"=>7 }
sz = h.size
#=> 6
h.select { (sz -= 1) < 4 }
#=> {"f"=>3, "e"=>1, "c"=>3, "a"=>7}
另一种hash->array->hash
方式,如果您使用Ruby 2.2+,将使用接受参数的Enumerable#max形式。如果数组相对于所需的最大值的数量很大,那么比排序数组更有效。
h.max(4).to_h
#=> {"f"=>3, "e"=>1, "d"=>6, "c"=>3}
答案 1 :(得分:1)
为了获得哈希的最后四个元素,你应该首先map
将它作为数组,获取所需的索引,然后再将数组转换为哈希值。
例如:
2.2.1 :001 > hash = {a: 1, b: 2, c: 3, d: 4, e: 5}
=> {:a=>1, :b=>2, :c=>3, :d=>4, :e=>5}
2.2.1 :002 > hash.map{|h| h}[-4..-1].to_h
=> {:b=>2, :c=>3, :d=>4, :e=>5}
在您的特定情况下,代码可能如下所示:
metric.sort.map{|h| h}[-4..-1].to_h.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
另一种写作方式可能是:
last_four_metrics = metric.sort.map{|h| h}[-4..-1].to_h
top_points = last_four_metrics.map{|k, v| { x: Time.parse(k).to_time.to_i, y: v['top_10'] }}
average_points = last_four_metrics.map{|k, v| { x: Time.parse(k).to_time.to_i, y: v['average'] }}
更新:与Ruby 1.9的兼容性
last_four_metrics = Hash[ metric.sort.map{|h| h}[-4..-1] ]
top_points = last_four_metrics.map{|k, v| { x: Time.parse(k).to_time.to_i, y: v['top_10'] }}
average_points = last_four_metrics.map{|k, v| { x: Time.parse(k).to_time.to_i, y: v['average'] }}
答案 2 :(得分:0)
metrics.sort.last(4).to_h
将为您提供最后四个元素的哈希值。
假设您最初没有想要排序,请使用相同的想法:
metrics.to_a.last(4).to_h
更新:鉴于您添加了1.9限制,Array#to_h
来自2.1以后,您可以将x.to_h
替换为Hash[x]
。
或者,如果您不需要哈希并希望迭代键/值对,省略.to_h
部分并继续使用.each do |key, value|
几乎也会这样做。
答案 3 :(得分:0)
您可以将哈希转换为2元素数组,为元素选择最后一个并转换回哈希:
top_points = {}
(1..10).each { |i| top_points[i] = i*2 }
# => top_points == {1=>2, 2=>4, 3=>6, 4=>8, 5=>10, 6=>12, 7=>14, 8=>16, 9=>18, 10=>20}
Hash[top_points.to_a[-4..-1]]
# => {7=>14, 8=>16, 9=>18, 10=>20}
你需要使用ruby 1.9+才能工作(因为这个版本它按照给定的顺序保存哈希键)。