2016-05-02 10 views
0

Ich habe einen Hash, dass ich alle Daten für ein Dashboard auswählen, um die Leistung anzuzeigen, da die neuesten Werte nicht immer hilfreich ist, versuche ich um die letzten 4 Werte aus einem Hash zu wählen.Hash/Ruby - Wählen Sie die letzten 4 Werte (Durchschnitt) in Hash

Ich habe versucht, die thing.last(4), aber ohne Erfolg.

Der Code ist unten, im Wesentlichen versucht, die letzten 4 von top_points oder Durchschnittspunkte anzuzeigen.

Hinweis: Rubin 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 ..- 1]' –

+0

Ich habe meine Antwort aktualisiert. –

Antwort

1

Um die letzten vier Elemente Ihres Hash zu erhalten, sollten Sie zuerst map es als ein Array, die gewünschten Indizes erhalten und dann das Array wieder in einen Hash transformieren.

Zum Beispiel:

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} 

In Ihrem speziellen Fall könnte der Code wie folgt aussehen:

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 

Ein anderer Weg, es sein könnte zu schreiben:

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

Update: Kompatibilität mit Ruby 1.9

+0

Ich mag das am besten. Ich würde es zwar getrennt haben, da das, was ich mache, der Graph wird so angezeigt, wie es ist, aber der "Schlüssel" oder "Legende" würden die Durchschnittswerte sagen. Ran in das bei dem Versuch zu implementieren to_h NoMethodError 70214561670280 undefined Methode 'to_h 'für # Ich bin 1.9 – Spartacus38

+0

tatsächlich die Methode' .to_h' wird von Ruby 2.1 unterstützt. Ein alternativer Weg ist 'Hash [your_array]' – mabe02

+0

Das funktionierte wie ein Zauber! Jetzt, um das getrennt für meine Legende zu integrieren. Vielen Dank! Und um die letzten 4 zu mitteln? – Spartacus38

0
metrics.sort.last(4).to_h 

geben Ihnen einen Hash mit den letzten vier Elemente.


Angenommen, Sie ursprünglich nicht sortieren möchten, verwenden Sie die gleiche Idee:

metrics.to_a.last(4).to_h 

Update: Da Sie die 1.9 Einschränkung hinzugefügt und Array#to_h von 2.1 kommt weiter, Sie kann x.to_h durch Hash[x] ersetzen.

Oder wenn Sie den Hash nicht benötigen und über die Schlüssel/Wert-Paare iterieren möchten, das .to_h Teil weglassen und mit .each do |key, value| fortfahren wird ziemlich genau dasselbe tun.

0

Sie den Hash auf ein 2-Element-Array umwandeln kann, wählen Sie die letzte für Elemente und konvertieren zurück zu hash:

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} 

Sie müssen Ruby verwenden 1.9+ für diese (seit dieser Version zu arbeiten es hält Hash-Schlüssel in der angegebenen Reihenfolge).

3

Im Folgenden wird Hash#select verwendet, um die Notwendigkeit zu vermeiden, den Hash in ein Array zu konvertieren, das Array zu manipulieren und es dann wieder in einen Hash umzuwandeln.

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} 

Eine weitere hash->array->hash Weise, wenn Sie Ruby-Version 2.2 oder höher verwenden, wäre die Form Enumerable#max zu verwenden, das ein Argument akzeptiert. Dies wäre effizienter als das Sortieren des Arrays, wenn das Array relativ zur Anzahl der größten gewünschten Werte groß ist.

Verwandte Themen