javascript - 在 Node.js 中对类数组进行排序
问题描述
我正在尝试为节点中的 NFL 创建额定功率。我为每个 NFL 球队建立了一个模型,其中包含从外部 API 中提取的统计数据。在每种模型下,我都有一个数组,其中包含球队在整个赛季中每场 nfl 比赛的胜利幅度。每个类都有一个 getter 方法,然后简单地获取该数组的平均值以返回该团队的平均胜利幅度。
我的困境:我现在正试图根据平均胜率对球队进行排名。所以我会对每支球队都有一个数组,平均胜利率最高的球队在数组的 0 索引处,而平均胜利率最低的球队在数组的第 31 个索引处(32 支 nfl 球队)。请参阅下面的代码,并确保查看终端响应。 实际的 teams_array 拥有所有 32 支 nfl 球队,但不想在堆栈上发布整个内容。
get_teams.js
import axios from 'axios';
import Nfl_team from '../models/teamModel.js';
import Offensive_stats from '../models/offensiveStatsModel.js'
import Defensive_stats from '../models/defensiveStatsModel.js';
import Game_stats from '../models/gameStatsModel.js';
import colors from 'colors';
import dotenv from 'dotenv';
dotenv.config();
const teams = {};
axios.all([
axios.get(`https://api.sportsdata.io/api/nfl/fantasy/json/Standings/${process.env.SEASON}?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamSeasonStats/${process.env.SEASON}?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/1?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/2?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/3?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/4?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/5?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/6?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/7?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/8?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/9?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/10?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/11?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/12?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/13?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/14?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/15?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/16?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}/17?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}POST/1?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}POST/2?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}POST/3?key=${process.env.API_KEY}`),
axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamGameStats/${process.env.SEASON}POST/4?key=${process.env.API_KEY}`)
])
.then(function (responseArr) {
responseArr[0].data.forEach(element => {
teams[element.Team] = new Nfl_team(element.Team, element.Name, element.Wins, element.Losses, element.Ties,
element.Percentage, element.DivisionWins, element.DivisionLosses, element.DivisionTies,
element.PointsFor, element.PointsAgainst)
});
responseArr[1].data.forEach(element => {
teams[element.Team]['offensive_stats'] = new Offensive_stats(element.Team, element.Touchdowns, element.RushingYardsPerAttempt,
element.PassingYardsPerAttempt, element.CompletionPercentage, element.PasserRating, element.TimesSacked,
element.QuarterbackHits, element.OffensivePlays);
teams[element.Team]['defensive_stats'] = new Defensive_stats(element.Team, element.OpponentTouchdowns, element.OpponentRushingYardsPerAttempt,
element.OpponentPassingYardsPerAttempt, element.OpponentCompletionPercentage, element.OpponentPasserRating, element.OpponentTimesSacked,
element.OpponentQuarterbackHits, element.OpponentOffensivePlays);
});
responseArr[2].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[3].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[4].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[5].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[6].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[7].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[8].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[9].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[10].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[11].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[12].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[13].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[14].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[15].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[16].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[17].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[18].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[19].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[20].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[21].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
responseArr[22].data.forEach(element => {
const game_stats = new Game_stats(element.Team, element.Opponent, element.HomeOrAway, element.Score, element.OpponentScore, element.TotalScore);
const margin_of_victory = element.Score - element.OpponentScore;
const margin_of_victory_obj = {[element.Team]: margin_of_victory}
teams[element.Team]['game_stats'].push(game_stats);
teams[element.Team]['victory_margin_arr'].push(margin_of_victory);
});
/* power rating algorithm logic
_____________________________________________ */
const teams_array = Object.entries(teams);
console.log(teams_array);
// console.log(teams);
// console.log(off_stats_arr);
teams_array.forEach(element => {
console.log(`average victory margin for ${element[0]} = ${element[1].average_victory_margin}`)
});
// teams_array.sort((a, b) => {
// const sorted_teams_array = []
// if (a.Team > b.Team) {
// sorted_teams_array.push(a)
// }
// console.log(sorted_teams_array)
// })
})
.catch(function (error) {
// handle error
console.log(error);
})
团队模型.js
import stats from 'stats-lite';
import toFixed from 'tofixed';
export default class Nfl_team {
constructor(team=String, name=String, wins=Number, losses=Number, ties=Number, win_percentage=Number,
division_wins=Number, division_losses=Number, division_ties=Number, points_for=Number, points_against=Number) {
this.team = team;
this.name = name;
this.wins = wins;
this.losses = losses;
this.ties = ties;
this.win_percentage = win_percentage;
this.division_wins = division_wins;
this.division_losses = division_losses;
this.division_ties = division_ties;
this.points_for = points_for;
this.points_against = points_against;
this.victory_margin_arr = [];
this.game_stats = [];
this.offensive_stats = {};
this.defensive_stats = {};
}
get record() {
return [this.wins,this.losses,this.ties];
}
get division_record() {
return [this.division_wins, this.division_losses, this.division_ties];
}
get average_victory_margin() {
return stats.mean(this.victory_margin_arr);
}
}
终端反应
[
[
'CAR',
Nfl_team {
team: 'CAR',
name: 'Carolina Panthers',
wins: 5,
losses: 11,
ties: 0,
win_percentage: 0.313,
division_wins: 1,
division_losses: 5,
division_ties: 0,
points_for: 340,
points_against: 470,
victory_margin_arr: [Array],
game_stats: [Array],
offensive_stats: [Offensive_stats],
defensive_stats: [Defensive_stats]
}
],
[
'SF',
Nfl_team {
team: 'SF',
name: 'San Francisco 49ers',
wins: 13,
losses: 3,
ties: 0,
win_percentage: 0.813,
division_wins: 5,
division_losses: 1,
division_ties: 0,
points_for: 479,
points_against: 310,
victory_margin_arr: [Array],
game_stats: [Array],
offensive_stats: [Offensive_stats],
defensive_stats: [Defensive_stats]
}
],
[
'SEA',
Nfl_team {
team: 'SEA',
name: 'Seattle Seahawks',
wins: 11,
losses: 5,
ties: 0,
win_percentage: 0.688,
division_wins: 3,
division_losses: 3,
division_ties: 0,
points_for: 405,
points_against: 398,
victory_margin_arr: [Array],
game_stats: [Array],
offensive_stats: [Offensive_stats],
defensive_stats: [Defensive_stats]
}
],
[
'LAR',
Nfl_team {
team: 'LAR',
name: 'Los Angeles Rams',
wins: 9,
losses: 7,
ties: 0,
win_percentage: 0.563,
division_wins: 3,
division_losses: 3,
division_ties: 0,
points_for: 394,
points_against: 364,
victory_margin_arr: [Array],
game_stats: [Array],
offensive_stats: [Offensive_stats],
defensive_stats: [Defensive_stats]
}
],
[
'ARI',
Nfl_team {
team: 'ARI',
name: 'Arizona Cardinals',
wins: 5,
losses: 10,
ties: 1,
win_percentage: 0.344,
division_wins: 1,
division_losses: 5,
division_ties: 0,
points_for: 361,
points_against: 442,
victory_margin_arr: [Array],
game_stats: [Array],
offensive_stats: [Offensive_stats],
defensive_stats: [Defensive_stats]
}
]
]
average victory margin for NE = 11.058823529411764
average victory margin for BUF = 3.0588235294117645
average victory margin for NYJ = -5.1875
average victory margin for MIA = -11.75
average victory margin for BAL = 13.705882352941176
average victory margin for PIT = -0.875
average victory margin for CLE = -3.625
average victory margin for CIN = -8.8125
average victory margin for HOU = -1.3333333333333333
average victory margin for TEN = 4.368421052631579
average victory margin for IND = -0.75
average victory margin for JAX = -6.0625
average victory margin for KC = 9.736842105263158
average victory margin for DEN = -2.125
average victory margin for LV = -6.625
average victory margin for LAC = -0.5
average victory margin for PHI = 1.3529411764705883
average victory margin for DAL = 7.0625
average victory margin for NYG = -6.875
average victory margin for WAS = -10.5625
average victory margin for GB = 2.8333333333333335
average victory margin for MIN = 5.166666666666667
average victory margin for CHI = -1.125
average victory margin for DET = -5.125
average victory margin for NO = 6.529411764705882
average victory margin for TB = 0.5625
average victory margin for ATL = -1.125
average victory margin for CAR = -8.125
average victory margin for SF = 10.105263157894736
average victory margin for SEA = 0.5555555555555556
average victory margin for LAR = 1.875
average victory margin for ARI = -5.0625
解决方案
我认为您在使用此注释掉的代码时走在了正确的轨道上:
// teams_array.sort((a, b) => {
// const sorted_teams_array = []
// if (a.Team > b.Team) {
// sorted_teams_array.push(a)
// }
// console.log(sorted_teams_array)
// })
查看Array.sort()文档。
sort() 方法对数组的元素进行就地排序并返回排序后的数组
它会更像:
const sorted_teams_array = teams_array.sort((a, b) => {
if (a[1].average_victory_margin > b[1].average_victory_margin) return -1;
if (a[1].average_victory_margin < b[1].average_victory_margin) return 1;
return 0;
}
推荐阅读
- docker - Dockerized nginx 在数千个请求后挂起
- tensorflow - Keras 内存不足的后果
- oracle - Oracle xe 18c 数据库自动关闭
- php - 按自定义产品属性过滤产品并在 WP_Query 中发布元数据
- pip - 如何解决 gTTS 安装错误?
- xml - 需要用于 xhtml:link 的 XSLT 选择器
- haskell - 如何确定 Haskell 中是否正在记忆函数?
- sql - pyspark sql查询:根据条件计算不同的值
- r - 在不展开()的情况下在 y 轴上方添加空间
- powershell - 需要一个 PowerShell 脚本来查找昨天没有修改文件的文件夹