首页 > 解决方案 > 为什么我不能按对象的实例排序?

问题描述

我正在尝试players按每个玩家的平均得分对对象进行排序 - 然后返回数组中的前 3 名玩家。

我得到了sort is not a function这让我觉得我没有在正确的数据类型上调用它(我试图按一个数字排序,称为“平均”)。

我尝试以多种方式编写该函数,希望能够访问in的average属性但不断获取.playerplayerssort is not a function

下面是我的代码(不包括已经工作的函数):

class Player {
    constructor(player_id, score) {
        this.player_id = player_id;
        this.scores = [score];
        this.total = score;
        this.average = this.averageScore();
    }

    averageScore() {
        return this.scores.length ? this.total / this.scores.length : 0;
    }

};

class LeaderBoard {

    constructor() {
        this.players = {};
    }

    top = (num_players) => {
      var sorted = this.players.sort((a, b) => (a.average > b.average) ? 1 : -1)
      return sorted.slice(0, num_players);
    }

};

我希望它num_players在按平均值排序后返回一个索引数组,从 0 到它们,但是我得到了sort is not a function- 我做错了什么?

标签: javascriptsorting

解决方案


似乎您正在使用this.players带有键作为玩家名称的对象。你想得到对象作为结果。如果是这种情况,请使用Objects.keys前 3 名,然后用于reduce()转换回对象。

var sorted = Object.entries(this.players)
                           .sort(([,v1], [,v2]) => v1.average - v2.average)
                           .slice(0,num_players)
                           .reduce((ac,[k]) => ({...ac,[k]:this.players[k]}),{})

推荐阅读