javascript - 按属性对嵌套对象排序不起作用

标签 javascript sorting

我正在尝试通过其中 player 实例的 average 属性对对象 players 进行排序,但我不能访问使其工作。

这是我记录 Players 对象时的样子:

[ Player { player_id: 1, scores: [ 50 ], total: 50, average: 50 },
  Player { player_id: 2, scores: [ 80, 70, 60 ], total: 210, average: 80 },
  Player { player_id: 3, scores: [ 90, 85 ], total: 175, average: 90 } ]

但我的排序功能似乎没有效果 - 我想我需要在某处添加 player 以访问嵌套对象。

这是函数代码:

/* class definition excluded */

    top = (num_players) => 
      Object.values(this.players)
        .sort((a, b) => (a.average - b.average))
        .slice(0, num_players);
};

为此函数编写的测试返回以下内容:

Top 3 [[object Object],[object Object],[object Object]] should equal [3, 2, 1]:

对于上下文,这里是带有测试用例的整个脚本,如果您想尝试的话:

class Player {
  constructor(player_id, score) {
    this.player_id = player_id;
    this.scores = [score];
    this.total = score;
    this.average = this.averageScore();
  }

  addScore(score) {
    this.total += score;
    this.scores.push(score);
    return score;
  }

  averageScore() {
    return this.scores.length ? this.total / this.scores.length : 0;
  }

  resetScore() {
    this.scores = [];
    this.score = 0;
  }

};

class LeaderBoard {

  constructor() {
    this.players = {};
  }

  add_score(player_id, score) {
    if (!this.players[player_id]) {
      this.players[player_id] = new Player(player_id, score);
    } else {
      this.players[player_id].addScore(score);
    }
    var average = this.players[player_id].averageScore();
    return average.toFixed(1);
  }

  top = (num_players) =>
    // console.log(Object.values(this.players);
    Object.values(this.players)
    .sort((a, b) => (a.average - b.average))
    .slice(0, num_players);

  reset = (player_id) => {
    this.players[player_id].resetScore();
  }
};

// Test code here

function array_equals(a, b) {
  if (a === b) return true;
  if (a == null || b == null) return false;
  if (a.length != b.length) return false;
  for (var i = 0; i < a.length; ++i) {
    if (a[i] !== b[i]) return false;
  }
  return true;
}

var leader_board = new LeaderBoard()

leader_board.add_score(1, 50)
console.log(leader_board.add_score(2, 80) == 80)
console.log(leader_board.add_score(2, 70) == 75)
console.log(leader_board.add_score(2, 60) == 70)
console.log('Add score should return the average. test with 1 score')
console.log(leader_board.add_score(3, 90) == 90)
console.log('Add score should return the average. test with 2 scores')
console.log(leader_board.add_score(3, 85) == 87.5)
console.log('Top 3 [' + leader_board.top(3) + '] should equal [3, 2, 1]:')
console.log(array_equals(leader_board.top(3), [3, 2, 1]))
console.log('Top 2 [' + leader_board.top(2) + '] should equal [3, 2]:')
console.log(array_equals(leader_board.top(2), [3, 2]))
leader_board.reset(3)
console.log('After reset top 3 [' + leader_board.top(3) + '] should equal [2, 1, 3]')
console.log(array_equals(leader_board.top(3), [2, 1, 3]))

我希望 top 能够按 averageplayers 的对象进行排序,然后将它们返回到一个数组中0 到 num_players 但我没有成功排序。

到目前为止我还没有运气 - 如何按嵌套属性排序?

最佳答案

  1. 您正在将 Player 对象与对象本身的属性 (player_id) 进行比较。 正确的断言语句看起来像这样:
console.log(array_equals(leader_board.top(3).map(p => p.player_id), [3, 2, 1]))
  1. 您的排序功能方向错误,只需将其切换为:
    sort((a, b) => (b.average - a.average))

关于javascript - 按属性对嵌套对象排序不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55623346/

相关文章:

c - 如何按降序对这个链表进行排序?

android - 如何按距离对 RealmList 或 RealmResult 进行排序?

javascript - 更新 jquery 关联数组值

javascript - 我正在尝试通过单击注销按钮来销毁用户 session ,这是一个问题,我必须按两次才能注销/销毁 session

javascript - vuejs动态组件throw error for v-bind :is, error is Property or method ... is not defined on the instance but referenced during render

javascript - 直播到浏览器

python - 如何优化这个python问题?

javascript - 使用 Javascript 在 TestComlete 中处理对象不存在错误

c++ - GPU 加速排序 (~1GB) 和归并排序 (~100GB)

performance - 是否有任何现实世界的 CPU 不使用 IEEE 754?