簡體   English   中英

對 Node.js 中的類數組進行排序

[英]Sorting array of classes in Node.js

我正在嘗試在節點中為 NFL 創建一個額定功率。 每支 NFL 球隊都有一個 model,其中包含我從外部 API 中提取的統計數據。在每個 model 下,我有一個數組,其中包含該球隊整個賽季每場 nfl 比賽的勝率。 每個 class 都有一個 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);
  })

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

終端響應

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM