2016-06-19 12 views
0

Ich muss einen einfachen Ranking-Algorithmus in Ember erstellen. Es muss eine Reihe von Ember-Modellen nehmen und eine Ordinalzahl erzeugen, die im Falle von Bindungen den gleichen Rang zuweist und die verbundenen Ränge entsprechend überspringt. Die Anzahl der Elemente in jedem Array ist klein, so dass die Leistung keine kritische Überlegung ist. Ich würde gerne Ember-Idiome beibehalten, wo es möglich ist.Ember Ranking-Algorithmus

Beispiel:

// models/competition.js 
export default Model.extend({ 
    competitors: hasMany('competitor') 
    ranks: computed.[ranking function here] 
}); 

// models/competitor.js 
export default Model.extend({ 
    name: attr('string'), 
    score: attr('number'), 
    competition: belongsTo('competition') 
    rank: computed.[return rank here] 
}); 

Dann, angesichts der folgenden Konkurrenten, Partituren:

Alpha, 100 
Beta, 90 
BetaPrime, 90 
BetaDoublePrime, 90 
Gamma, 80 

würde Ich mag die rank berechnete Eigenschaft zurück, wie folgt:

Alpha, 1 
Beta, 2 
BetaPrime, 2 
BetaDoublePrime, 2 
Gamma, 5 

I kann dies in Python tun, aber ich bin neu in Ember/Javascript und kann das nicht ganz herausfinden. Ich bin mir sicher, dass eine Kombination aus Map/Reduce der Schlüssel ist, aber ansonsten ahnungslos ... Danke.

Antwort

0

Wenn Sie die rankins im Wettbewerbsmodell berechnen wollen, würde ich so etwas tun:

ranks: Ember.computed('competitors', function() { 
    let lastScore = null; 
    let lastRank = null; 
    return this.get('competitors').sortBy('score').reverse().map((competitor, index) => { 
     let score = competitor.get('score'); 
     let rank = score === lastScore ? lastRank : index+1; 
     lastScore = score; 
     lastRank = rank; 
     return { 
      competitor: competitor, 
      rank: rank 
     }; 
    }); 
}) 

Dies wird zunächst die Konkurrenten nach Punkten sortiert (Sie mehrere Eigenschaften festlegen können, auf sortieren, zum Beispiel Um zu entscheiden, was zu tun ist, wenn die Punktzahl gleich ist, kehren Sie das Ergebnis um, um zuerst die höchste Punktzahl zu erhalten, und geben Sie dann ein Objekt für jeden sortierten Teilnehmer mit dem Teilnehmer selbst und dem Rang zurück.

Ich denke, es ist keine gute Idee, dies im Wettbewerb Modell zu speichern, ein Rang gehört zu einem Wettbewerb (obwohl in Ihrer Situation ein Konkurrent scheint nur ein Wettbewerb zu sein). Wenn Sie den Rang eines Mitbewerbers bekommen wollen, schauen Sie einfach im Wettbewerb nach.

+0

Dies implementiert nicht die Schlüsselfunktion, die Krawatten denselben Rang zuweist. – dbinetti

+0

@dhinetti Ich aktualisierte die Antwort – jcbvm

+0

(Bearbeitete Anforderungen, um genauer zu sein :) Danke, aber ich brauche die Krawatte Rang übersprungen, so dass das Ergebnis ist: 'Alpha, 1; Beta, 2; BetaPrime, 2; BetaDoublePrime, 2; Gamma, 5; 'Diese Antwort erzeugt' Alpha, 1; Beta, 2; BetaPrime, 2; Gamma, 3; ' – dbinetti