为了账号安全,请及时绑定邮箱和手机立即绑定

Javascript 排序函数不排序

Javascript 排序函数不排序

心有法竹 2023-03-18 15:05:51
我正在使用 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() 函数上执行它。
查看完整描述

3 回答

?
潇湘沐

TA贡献1816条经验 获得超6个赞

您的比较函数返回一个布尔值。Array.sort() 期望您返回一个数字。

如果您的比较函数返回值 < 0,则“a”将放在“b”之前。

如果您的比较函数返回值 > 0,则“b”将放在“a”之前。

如果您的比较函数返回 0,则订单将保持原样。

因此,要按降序排列星星的数量,您可以这样做:

this.topPlayers.sort((a, b) => b.stars - a.stars);

如果'a'比'b'有更多的星星,返回值将为负,'a'将排在'b'之前,反之亦然。


查看完整回答
反对 回复 2023-03-18
?
慕森卡

TA贡献1806条经验 获得超8个赞

这是因为Array 的 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);


查看完整回答
反对 回复 2023-03-18
?
人到中年有点甜

TA贡献1895条经验 获得超7个赞

作为参数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;

});

对于升序,您只需要 returna.stars - b.stars即可。


查看完整回答
反对 回复 2023-03-18
  • 3 回答
  • 0 关注
  • 211 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号