2016-05-02 15 views
0

ダッシュボードのパフォーマンスを表示するためにすべてのデータを選択しています。ハッシュから最後の4つの値を選択します。ハッシュ/ルビー - ハッシュで最後の4つの値を選択(平均値)

私はthing.last(4)を試みましたが、役に立たないです。

コードは基本的に最後の4をtop_pointsから表示しようとしています。

注: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

'thing.values [-4 ..-]] –

+0

私は自分の答えを更新しました。 –

答えて

1

ハッシュの最後の4つの要素を取得するには、最初にmapを配列として使用し、必要なインデックスを取得してから、配列をハッシュに再度変換します。例えば

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'] }} 

更新:それができる書き込みに

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 

もう一つの方法:あなたの特定のケースで

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} 

、コードは次のようになります。 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'] }} 
+0

私はこのようにベストを選びます。グラフはそのまま表示されますが、「キー」または「凡例」には平均が表示されているため、グラフを分割していますが、 No_ethodError to_hを実装しようとしているときにこれにランしてください 70214561670280#のための未定義メソッド 'to_h '私は1.9 – Spartacus38

+0

を使用しています。実際に' .to_h'メソッドはRuby 2.1からサポートされています。 もう1つの方法は 'Hash [your_array]' – mabe02

+0

です。これは魅力的に機能しました!今私の伝説のためだけにこれを別個に統合する。ありがとう!最後の4つを平均化するには? – Spartacus38

0
metrics.sort.last(4).to_h 

はあなたに最後の4つの要素を持つハッシュを与えるだろう。あなたは、もともと、並べ替える同じ考えを使用したくなかったと仮定すると、


metrics.to_a.last(4).to_h 

更新:あなたは1.9制限追加を考えるとArray#to_hは、以降2.1からあなたを来りますx.to_hHash[x]に置き換えることができます。

また、ハッシュを必要とせず、キー/値のペアを反復処理する場合は、.to_hの部分を省略して.each do |key, value|を続けるとほぼ同じことになります。

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} 

あなたはこれが動作するために、このバージョン以降(ルビー1.9+を使用する必要があります指定された順序でハッシュキーを保持します)。

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}