我正在使用Javascript排序对对象数组进行排序。 这就是为什么我要尝试(选择我阵列中10个最好的球员)的原因:
this.topPlayers .sort(function(a, b) {
return a.stars > b.stars;
});
this.topPlayers = this.topPlayers.slice(0,10);
当我这样做时(这10个最差的玩家),它会给我同样的东西:
this.topPlayers .sort(function(a, b) {
return a.stars < b.stars;
});
this.topPlayers = this.topPlayers.slice(0,10);
我在做什么错?两种情况下的结果相同,尝试对其他属性进行排序,结果再次相同...我正在使用angular并在ngOnInit()函数上进行操作。
答案 0 :(得分:2)
您的比较函数返回一个布尔值。 Array.sort()希望您返回一个数字。
如果您的比较函数返回的值<0,则'a'将放置在'b'之前。
如果您的比较函数返回的值> 0,则'b'将放置在'a'之前。
如果您的比较函数返回0,则顺序将保持不变。
因此,要按降序的星数排序,可以执行以下操作:
this.topPlayers.sort((a, b) => b.stars - a.stars);
如果'a'的恒星比'b'多,则返回值将为负,并且'a'将在'b'之前排序,反之亦然。
答案 1 :(得分:2)
这是因为Array's sort()希望函数返回一个数字值,而不是您要提供的布尔值。负结果表示排序较低,0表示保持不变,正表示排序较高。
在ES6中,使用类似以下的内容:
let top10 = this.topPlayers
.sort((a,b) => b.stars - a.stars)
.slice(0,10);
let bottom10 = this.topPlayers
.sort((a,b) => a.stars - b.stars)
.slice(0,10);
答案 2 :(得分:1)
Array.prototype.sort
需要一个比较函数作为参数,该函数返回一个数字值而不是布尔值。
此比较功能需要遵循以下逻辑:
function compare(a, b) {
if (a is less than b by some ordering criterion) {
return -1; // or any value smaller than zero
}
if (a is greater than b by the ordering criterion) {
return 1; // or any value greater than zero
}
// a must be equal to b
return 0;
}
在您的情况下,如果stars
是数字,则可以通过以下方式对数组进行降序排列:
this.topPlayers.sort(function(a, b) {
return b.stars - a.stars;
});
对于升序,您只需要返回a.stars - b.stars
。