Nodejs 中的 OOP。嵌套类?

OOP in Nodejs. Nesting Classes?

我正在尝试为每个 nfl 球队创建一个 class。在我下面的代码中,您可以看到我创建了两个对外部 API 的 https 请求。第一个请求为每个 NFL 球队创建一个 class 并具有各种站立数据,第二个请求然后为每个球队创建两个不同的 class 对象。一份用于进攻数据,一份用于防守数据。

我想要的结果是将进攻统计数据 class 和防守统计数据 class 附加到 Nfl_team class 上,基于它匹配球队 属性。因此,与其为每支球队返回三个不同的 classes,不如为每支 nfl 球队返回一个 class,并为进攻和防守统计数据提供两个 sub-classes。有人可以帮助我或指出正确的方向吗?!我什至完全不知道如何做到这一点并且在网上找不到任何东西,也许我只是不知道要寻找什么。任何帮助都会很棒。

可以在评论中找到api键

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 colors from 'colors';
import dotenv from 'dotenv';
dotenv.config();


let team = {};

axios.all([
        axios.get(`https://api.sportsdata.io/api/nfl/fantasy/json/Standings/2019?key=${process.env.API_KEY}`),
        axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamSeasonStats/2019?key=${process.env.API_KEY}`)
    ])
    .then(function (responseArr) {

        /* Create a for each loop that goes over each obj and returns a new team object using NFL 
         team model with updated stats from sportsdata.io 
       __________________________________________________________________________________________*/

        responseArr[0].data.forEach(element => {

            let team = {
                [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)
            }

            // console.log(`Model for ${element.Name}: `.bold.brightBlue)
            // console.log(team);

            

        })

        responseArr[1].data.forEach(element => {

            let offensive_stats = new Offensive_stats(element.Team, element.Touchdowns, element.RushingYardsPerAttempt,
                element.PassingYardsPerAttempt, element.CompletionPercentage, element.PasserRating, element.TimesSacked,
                element.QuarterbackHits, element.OffensivePlays);

            // console.log(`Offensive Stats Model for ${element.Team}: `.bold.brightBlue)
            // console.log(offensive_stats);
            // console.log(`qb hit percentage = ${offensive_stats.quarterback_hits_percentage}`.bold.brightRed);

            console.log(team);
        })

        responseArr[1].data.forEach(element => {

            let defensive_stats = new Defensive_stats(element.Team, element.OpponentTouchdowns, element.OpponentRushingYardsPerAttempt,
                element.OpponentPassingYardsPerAttempt, element.OpponentCompletionPercentage, element.OpponentPasserRating, element.OpponentTimesSacked,
                element.OpponentQuarterbackHits, element.OpponentOffensivePlays);

            // console.log(`Defensive Stats Model for ${element.Team}: `.bold.brightBlue)
            // console.log(defensive_stats);
            // console.log(`opponent qb hit percentage = ${defensive_stats.opponent_quarterback_hits_percentage}`.bold.brightRed);
        })

    })
    .catch(function (error) {
        // handle error
        console.log(error);
    })

team_model.js

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, offensive_stats, defensive_stats) {
        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.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];
    }
}

offensive_stat_model.js

export default class Offensive_stats {

    constructor (team, touchdowns, rushing_yards_per_attempt, passing_yards_per_attempt, completion_percentage, passer_rating, 
   times_sacked, quarterback_hits, offensive_plays) {
        this.team = team;
        this.touchdowns = touchdowns;
        this.rushing_yards_per_attempt = rushing_yards_per_attempt;
        this.passing_yards_per_attempt = passing_yards_per_attempt;
        this.completion_percentage = completion_percentage;
        this.passer_rating = passer_rating;
        this.times_sacked = times_sacked;
        this.quarterback_hits = quarterback_hits;
        this.offensive_plays = offensive_plays;
    }

    get quarterback_hits_percentage() {
        return this.offensive_plays / this.quarterback_hits;
    }
}

defensive_stat_model.js

export default class Defensive_stats {

    constructor (team, opponent_touchdowns, opponent_rushing_yards_per_attempt, oppenent_passing_yards_per_attempt, opponent_completion_percentage,
    opponent_passer_rating, opponent_times_sacked, opponent_quarterback_hits, opponent_offensive_plays) {
        this.team = team;
        this.opponent_touchdowns = opponent_touchdowns;
        this.opponent_rushing_yards_per_attempt = opponent_rushing_yards_per_attempt;
        this.oppenent_passing_yards_per_attempt = oppenent_passing_yards_per_attempt;
        this.opponent_completion_percentage = opponent_completion_percentage;
        this.opponent_passer_rating = opponent_passer_rating;
        this.opponent_times_sacked = opponent_times_sacked;
        this.opponent_quarterback_hits = opponent_quarterback_hits;
        this.opponent_offensive_plays = this.opponent_offensive_plays;
    }

    get opponent_quarterback_hits_percentage() {
        return this.opponent_offensive_plays / this.opponent_quarterback_hits;
    }
}

一个解决方案:

修改 team 模型以包含 offStatsdefStats 的占位符 - 或者其他内容,然后:

  1. 像这样将团队收集到一个对象文字中teams

{ [element.Team] : team } // {Ravens : Nfl_team_object}

  1. 在循环统计数据时,在每个循环中执行:

teams[element.Team].offStats = new Offensive_stats(...)

teams[element.Team].defStats = new Defensive_stats(...)

或者,使用您现有的代码:

teams[element.Team].offStats = offensive_stats;

每个团队都将 由团队元数据以及相关的 off/def 统计对象组成

代码如下:

axios.all([
    axios.get(`https://api.sportsdata.io/api/nfl/fantasy/json/Standings/2019?key=${process.env.API_KEY}`),
    axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamSeasonStats/2019?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);
    });

    responseArr[1].data.forEach(element => {
      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);
    });
    console.log(teams);

  })
  .catch(function(error) {
    // handle error
    console.log(error);
  })

是范围问题。

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 colors from 'colors';
import dotenv from 'dotenv';
dotenv.config();


let team = {};

axios.all([
        axios.get(`https://api.sportsdata.io/api/nfl/fantasy/json/Standings/2019?key=${process.env.API_KEY}`),
        axios.get(`https://api.sportsdata.io/api/nfl/odds/json/TeamSeasonStats/2019?key=${process.env.API_KEY}`)
    ])
    .then(function (responseArr) {

        /* Create a for each loop that goes over each obj and returns a new team object using NFL 
         team model with updated stats from sportsdata.io 
       __________________________________________________________________________________________*/

        responseArr[0].data.forEach(element => {

            team = {
                [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)
            }

            // console.log(`Model for ${element.Name}: `.bold.brightBlue)
            // console.log(team);

            

        })

        responseArr[1].data.forEach(element => {

            let offensive_stats = new Offensive_stats(element.Team, element.Touchdowns, element.RushingYardsPerAttempt,
                element.PassingYardsPerAttempt, element.CompletionPercentage, element.PasserRating, element.TimesSacked,
                element.QuarterbackHits, element.OffensivePlays);

            // console.log(`Offensive Stats Model for ${element.Team}: `.bold.brightBlue)
            // console.log(offensive_stats);
            // console.log(`qb hit percentage = ${offensive_stats.quarterback_hits_percentage}`.bold.brightRed);

            team.offensive_stats = offensive_stats;

            console.log(team);
        })

        responseArr[1].data.forEach(element => {

            let defensive_stats = new Defensive_stats(element.Team, element.OpponentTouchdowns, element.OpponentRushingYardsPerAttempt,
                element.OpponentPassingYardsPerAttempt, element.OpponentCompletionPercentage, element.OpponentPasserRating, element.OpponentTimesSacked,
                element.OpponentQuarterbackHits, element.OpponentOffensivePlays);

            // console.log(`Defensive Stats Model for ${element.Team}: `.bold.brightBlue)
            // console.log(defensive_stats);
            // console.log(`opponent qb hit percentage = ${defensive_stats.opponent_quarterback_hits_percentage}`.bold.brightRed);
        })

    })
    .catch(function (error) {
        // handle error
        console.log(error);
    })