[英]Sorting array of classes in Node.js
我正在嘗試在節點中為 NFL 創建一個額定功率。 每支 NFL 球隊都有一個 model,其中包含我從外部 API 中提取的統計數據。在每個 model 下,我有一個數組,其中包含該球隊整個賽季每場 nfl 比賽的勝率。 每個 class 都有一個 getter 方法,然后簡單地獲取該數組的平均值以返回該團隊的平均勝率。
我的困境:我現在試圖根據平均勝率對球隊進行排名。 所以我會為每支球隊建立一個數組,平均勝率最高的球隊位於數組的 0 索引處,而平均勝率最低的球隊位於數組的第 31 個索引處(32 個 nfl 球隊)。 請參閱下面的代碼並確保檢查終端響應。 實際的 teams_array 包含所有 32 個 nfl 球隊,但不想將整個內容都張貼在堆棧上。
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);
})
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; }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.