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 每个排序的竞争对手的对象,包含竞争对手本身和排名。
我认为将其保存在竞争者模型中不是一个好主意,一个排名属于一个竞争(尽管在您的情况下,竞争者似乎只是一个竞争的一部分)。如果你想获得竞争对手的排名,只需在比赛中查找即可。
我需要在 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 每个排序的竞争对手的对象,包含竞争对手本身和排名。
我认为将其保存在竞争者模型中不是一个好主意,一个排名属于一个竞争(尽管在您的情况下,竞争者似乎只是一个竞争的一部分)。如果你想获得竞争对手的排名,只需在比赛中查找即可。