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
模型以包含 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;
每个团队都将 由团队元数据以及相关的 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);
})
我正在尝试为每个 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
模型以包含 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;
每个团队都将 由团队元数据以及相关的 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);
})