我试图对用于在赛车联盟中展示排名的对象进行排序。我需要能够通过不是点而不是过去的完成位置来对驱动程序进行排序。如果车手得到相同数量的积分,那么之前的位置将从第一位开始,直到最后一位,这取决于联盟中有多少车手。具有所有驱动程序的对象看起来像这样:
var standings = [{
driver: "Bob",
points: 45,
positions: {
0: 1,
1: 0,
2: 1,
3: 2,
4: 0
}
}, {
driver: "Mandy",
points: 17,
positions: {
0: 0,
1: 2,
2: 4,
3: 0,
4: 1
}
}, {
driver: "Robert",
points: 24,
positions: {
0: 0,
1: 1,
2: 5,
3: 3,
4: 0
}
}];
位置对象是他们在特定位置完成的次数,该键表示位置,因此键0 =第一位,键1 =第二位。
position对象中key->值的数量会随着联盟中的驱动程序数量而变化。
我一直在尝试做的是弄清楚如何使用下划线_.sortby首先将它排序到最低位置,然后按顺序排列到第1位然后最后通过积分但是我似乎找不到这样做的方法 - 运行一个循环,在对象上运行sortby函数,对于position对象中的每个项目似乎都不起作用 - 它似乎只是重置。
我最初的尝试似乎无效:
var driverCount = 3;
for (i = 0; i < driverCount; i++) {
standings = _.sortBy(standings, 'positions['+i+']').reverse();
}
standings = _.sortBy(standings, 'points').reverse();
有什么想法吗?
答案 0 :(得分:0)
将您的对象更改为:
var standings = [{
driver: "Bob",
points: 45,
positions: [
{key:0, valeu:1},
{key:1, valeu:0},
{key:2, valeu:1},
{key:3, valeu:2},
{key:4, valeu:0}
]
}, {
driver: "Mandy",
points: 17,
positions: [
{key:0, valeu:0},
{key:1, valeu:2},
{key:2, valeu:4},
{key:3, valeu:0},
{key:4, valeu:1}
]
}, {
driver: "Robert",
points: 24,
positions:[
{key:0, valeu:0},
{key:1, valeu:1},
{key:2, valeu:5},
{key:3, valeu:3},
{key:4, valeu:0}
]
}];
使用排序功能对位置和排名进行排序:
for (i = 0; i < standings.length; i++) {
standings[i].positions = standings[i].positions.sort(()=>{
if (a.value == b.value)
return 0;
if (a.value > b.value)
return -1;
else
return 1;
})
}
而不是对数组的其余部分进行排序:
standings.sort((a,b)=>{
if (a.points == b.points)
return 0;
if (a.points > b.points)
return -1;
else
return 1;
});
没有测试代码,但你理解了这个想法
答案 1 :(得分:0)
你有一个复合排序功能。
我会使用类似的东西:
_sortBy(standings, (o) => o.points+Math.min(... _.pluck(o.positions, 'value')))); // wtach out your key is missspelled valeu