簡體   English   中英

Nodejs 中的 OOP。 嵌套類?

[英]OOP in Nodejs. Nesting Classes?

我正在嘗試為每個 nfl 團隊創建一個 class。 在下面的代碼中,您可以看到我向外部 API 創建了兩個 https 請求。 第一個請求為每個 NFL 球隊創建一個 class 並具有各種常備數據,然后第二個請求為每個球隊創建兩個不同的 class 對象。 一個用於進攻數據,一個用於防守數據。

我想要的結果是將進攻數據 class 和防守數據 class 附加到 Nfl_team class 上,以匹配 Team 屬性。 因此,與其為每支球隊返回三個不同的類別,不如為每支 nfl 球隊返回一個 class,並為進攻和防守統計數據提供兩個子類別。 有人可以幫助我或指出正確的方向嗎?,我完全不知道如何做到這一點,並且在網上找不到任何東西。 也許我只是不知道要尋找什么。 任何幫助都會很棒。

您可以在評論中找到 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];
    }
}

進攻性統計模型.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;
    }
}

防御性統計模型.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 model 以包含offStatsdefStats的占位符 - 或其他內容,然后:

  1. 將團隊收集到 object 文字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;

每個團隊將由團隊元數據加上相關的關閉/定義統計對象組成

這是代碼:

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

是 scope 問題。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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