JavaScript排序功能未排序

时间:2020-09-21 15:39:20

标签: javascript arrays json angular sorting

我正在使用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 个答案:

答案 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