[英]OOP in Nodejs. Nesting Classes?
我正在嘗試為每個 nfl 團隊創建一個 class。 在下面的代碼中,您可以看到我向外部 API 創建了兩個 https 請求。 第一個請求為每個 NFL 球隊創建一個 class 並具有各種常備數據,然后第二個請求為每個球隊創建兩個不同的 class 對象。 一個用於進攻數據,一個用於防守數據。
我想要的結果是將進攻數據 class 和防守數據 class 附加到 Nfl_team class 上,以匹配 Team 屬性。 因此,與其為每支球隊返回三個不同的類別,不如為每支 nfl 球隊返回一個 class,並為進攻和防守統計數據提供兩個子類別。 有人可以幫助我或指出正確的方向嗎?,我完全不知道如何做到這一點,並且在網上找不到任何東西。 也許我只是不知道要尋找什么。 任何幫助都會很棒。
您可以在評論中找到 api 密鑰
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);
})
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];
}
}
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;
}
}
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 以包含offStats
和defStats
的占位符 - 或其他內容,然后:
teams
中,如下所示: { [element.Team]: team } // {Ravens: Nfl_team_object}
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.