2016-07-09 17 views
1

Ich habe diesen Hash mit Wins, und ich sortiere es basierend auf wie viele Gewinne ein Spieler hat (eine Highscoreliste). Jetzt bekomme ich jeden Wert basierend auf einer Spieler-ID. Wie bekomme ich den Index des Wertes, den ich bekommen habe? (So ​​kann ich die Highscore-Platzierung bekommen).Get Index von Hash mit Hash-Schlüssel

#Highscore list. 
highscore = Hash.new 

@users.each_with_index do |player, index| 
    playerTotalGames = @finishedgames.where(log_id: player.id) 
    playerTotalWins = playerTotalGames.where(winner: true) 
    highscore[player.id] = playerTotalWins.length.to_i 
end 

@highscore = highscore.sort_by{ |k, v| v }.reverse.to_h # Sort highscore list 
+0

Ich bin verwirrt tun kann. Welchen Wert wünschen Sie den Index? – jeffdill2

+0

@ jeffdill2 zum Beispiel, wenn ich ein Array von Hashes habe, die wie folgt aussehen: highscore = {Playerid1 "=> 0," Playerid2 "=> 0} Und ich möchte den Hash für Playerid2, wie folgt erhalten: Highscore [@ user.id]. Jetzt möchte ich den Index dieses Hash. Also der Index für Playerid2 wird 1 und Index für Playerid1 wird 0 – Cinta

Antwort

2

Versuchen Sie folgendes:

index = @highscore.keys.find_index(player.id) 

Aber da es so aussieht, Sie gehen zu den @highscore Hash in seiner sortiert nach Punkten, um zu gehen, könnten Sie einfach verwenden with_index

@highscore.each.with_index(1) do |(player_id, score), position| 
    # use the block variables as you see fit 
end 

Die 1, die an with_index übergeben wurde, lässt die Position von 1 beginnen und nicht die Standard 0, was möglicherweise das ist, was Sie brauchen.

+0

Das hat funktioniert! Vielen Dank! – Cinta

+0

Bitte sehen Sie die aktualisierte Antwort. –

2

Um Ihren Code zu optimieren, (vorausgesetzt, Sie nicht playerTotalGames Variable an anderer Stelle verwenden), die Sie gerade playerTotalWins = @finishedgames.where(log_id: player.id, winner: true)

+0

Vielen Dank! nicht daran denken! Sieht viel sauberer aus! – Cinta