我正在尝试通过属性值对对象的集合进行排名。基本上,每个玩家对象都有一个得分属性,应该从最高到最低进行排名。例子:
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
}
};
通过分数对这些对象进行排名应该会产生以下结果:
{
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
}
}
重要的是分数相同的对象应具有相同的等级。
据我所知:
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;
}
这样会按照得分的顺序为每个对象分配“等级”属性,但是如何为绑定的对象赋予相同的等级编号?
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
}
]
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句