如何按属性对对象进行排序?

doc*_*tus 2 javascript

我正在尝试按属性值对对象集合进行排名。基本上每个玩家对象都有一个得分属性,应该从最高到最低排列。例子:

var players = {
    player1: {
        nickname: "Bob",
        score: 100
    },
    player2: {
        nickname: "Amy",
        score: 200
    },
    player3: {
        nickname: "Grant",
        score: 300
    },
    player4: {
        nickname: "Steve",
        score: 200
    },
    player5: {
        nickname: "Joe",
        score: 500
    }
};
Run Code Online (Sandbox Code Playgroud)

按分数对这些对象进行排名应产生以下结果:

{
    player1: {
        nickname: "Bob",
        score: 100,
        rank: 4
    },
    player2: {
        nickname: "Amy",
        score: 200,
        rank: 3
    },
    player3: {
        nickname: "Grant",
        score: 300,
        rank: 2
    },
    player4: {
        nickname: "Steve",
        score: 200,
        rank: 3
    },
    player5: {
        nickname: "Joe",
        score: 500,
        rank: 1
    }
}
Run Code Online (Sandbox Code Playgroud)

重要的是,具有相同分数的对象应该具有相同的排名。

据我所知:

var array = [];

for (var key in players) {
    array.push(players[key]);

}

array.sort(function(a, b){
    return a.score - b.score;
});

for (var i = 0; i < array.length; i++) {
    array[i].rank = i + 1;
}
Run Code Online (Sandbox Code Playgroud)

这将按照每个对象的得分顺序为每个对象分配一个“等级”属性,但是如何为绑定的对象提供相同的等级编号呢?

JS小提琴

Tim*_*lov 6

jsfiddle: https: //jsfiddle.net/2khtnjxw/1/

// change sort function
array.sort(function(a, b){
    return b.score - a.score;
});

var rank = 1;
for (var i = 0; i < array.length; i++) {
  // increase rank only if current score less than previous
  if (i > 0 && array[i].score < array[i - 1].score) {
    rank++;
  }
    array[i].rank = rank;
}

// result: 
[  
   {  
      "nickname":"Joe",
      "score":500,
      "rank":1
   },
   {  
      "nickname":"Grant",
      "score":300,
      "rank":2
   },
   {  
      "nickname":"Amy",
      "score":200,
      "rank":3
   },
   {  
      "nickname":"Steve",
      "score":200,
      "rank":3
   },
   {  
      "nickname":"Bob",
      "score":100,
      "rank":4
   }
]
Run Code Online (Sandbox Code Playgroud)