简体   繁体   中英

Sorting array of classes in Node.js

I am trying to create a power ratings for the NFL in node. I have a model for each NFL team with stats that I pulled from an external API. under each model I have an array with the margin of victory that team had for every nfl game through out the season. each class has a getter method that then simply gets the average of that array to return that teams average margin of victory.

My Dilemma: I am now trying to rank the teams based on the average margin of victory. So i would have an array with each team, with the team with the highest average victory margin at the 0 index of the array, and the team with the least average margin of victory at the 31st index of the array (32 nfl teams). See my code below and make sure to check out the terminal response. The actual teams_array has all 32 nfl teams but didnt want to post the entire thing here on stack.

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);
  })

teamModel.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);
    }
}

terminal response

[
  [
 '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

I think you were on the right track with this commented out code:

 // teams_array.sort((a, b) => {
 //   const sorted_teams_array = []
 //   if (a.Team > b.Team) {
 //     sorted_teams_array.push(a)
 //   }

 //   console.log(sorted_teams_array)
 // })

Take a look at the Array.sort() documentation.

The sort() method sorts the elements of an array in place and returns the sorted array

It would be more like:

 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; }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM