2016-06-19 5 views
0

Emberで簡単なランキングアルゴリズムを作成する必要があります。 Emberモデルの配列を取って、序列を生成する必要があります。序数は、同じランクを割り当て、それに応じて結合ランクをスキップします。各配列の項目数は少ないので、パフォーマンスは重要な考慮事項ではありません。私は可能な限りEmberのイディオムを維持したいと思います。Emberランキングアルゴリズム

例:次に

// 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] 
}); 

、以下の競合他社、得点与えられた次のように私は返すようにrank計算プロパティを希望

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

を:

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

私はPythonでこれを行うことができますが、私はEmber/Javascriptには新しく、これを理解することはできません。マップ/リダクションのいくつかの組み合わせが鍵だと思うが、それ以外の場合は断りなくてもいい...ありがとう。

答えて

0

あなたは競争モデルでrankinsを計算したい場合は、私はこのような何かをするだろう:

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 
     }; 
    }); 
}) 

これは、最初の例のために、あなたがソートする複数のプロパティを定義することができます(スコアによって競合他社をソートしますスコアが等しいときに何をするかを決める)、その結果を逆にして最初に最高得点を得た後、選別された各競技者の競技者自身とランクとのオブジェクトを返す。

これを競合他社モデルに保存することはお勧めしません。ランクは競技会に属します(あなたの状況では、競技者は1つの競技会に参加するようですが)。競合他社のランクを取得したい場合は、競合他社のランキングを参照してください。

+0

これは、同じランクをネクタイに割り当てるという重要な機能を実装していません。 – dbinetti

+0

@dbinetti私は答えを – jcbvm

+0

に更新しました(より正確に編集された要件:) ありがとうございますが、結果は次のようにスキップされます。ベータ、2; BetaPrime、2; BetaDoublePrime、2; Gamma、5;この答えは 'Alpha、1;ベータ、2; BetaPrime、2;ガンマ、3; ' – dbinetti

関連する問題