Алгоритм ранжирования 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]
});

Затем, учитывая следующих участников, баллы:

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

Я бы хотел, чтобы вычисляемое свойство rank возвращалось следующим образом:

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

Я могу сделать это на питоне, но я новичок в Ember/Javascript и не могу в этом разобраться. Я уверен, что ключом является какая-то комбинация map/reduce, но в остальном я не знаю... Спасибо.


person dbinetti    schedule 19.06.2016    source источник


Ответы (1)


Если вы хотите вычислить рейтинги в модели соревнований, я бы сделал что-то вроде этого:

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

Это сначала отсортирует конкурентов по баллам (вы можете определить несколько свойств для сортировки, например, чтобы решить, что делать, когда балл равен), инвертировать результат, чтобы сначала получить наивысший балл, а затем вернуть объект для каждого отсортированного конкурента. с самим участником и званием.

Я думаю, что не стоит сохранять это в модели конкурентов, ранг принадлежит соревнованию (хотя в вашей ситуации участник, кажется, является частью только одного соревнования). Если вы хотите получить звание конкурента, просто посмотрите его в конкурсе.

person jcbvm    schedule 19.06.2016
comment
Это не реализует ключевую функцию, которая заключается в присвоении одинакового ранга ничьим. - person dbinetti; 20.06.2016
comment
(Требования отредактированы, чтобы быть более точными:) Спасибо, но мне нужно пропустить ранг связи, чтобы результат был: Alpha, 1; Beta, 2; BetaPrime, 2; BetaDoublePrime, 2; Gamma, 5; Этот ответ дает Alpha, 1; Beta, 2; BetaPrime, 2; Gamma, 3; - person dbinetti; 23.06.2016