Ember 排名算法

Ember ranking algorithm

我需要在 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]
});

然后,给定以下竞争对手,得分:

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

我希望 rank 将 属性 计算为 return,如下所示:

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

我可以在 python 中做到这一点,但我是 Ember/Javascript 的新手,不太明白这一点。我确定 map/reduce 的某种组合是关键,但我一无所知...谢谢。

如果你想计算比赛模型中的排名,我会这样做:

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

这会先按照分数对参赛者进行排序(可以定义多个属性来排序,比如分数相等时决定做什么),反转结果先得到最高分return 每个排序的竞争对手的对象,包含竞争对手本身和排名。

我认为将其保存在竞争者模型中不是一个好主意,一个排名属于一个竞争(尽管在您的情况下,竞争者似乎只是一个竞争的一部分)。如果你想获得竞争对手的排名,只需在比赛中查找即可。