我正在向API發出一些請求。它來自遊戲。首先,我要求獲得一個ID,然後用該ID進行實況比賽,並且我要拔出的是每個人隨着球員姓名一起玩的角色。我在Python中做了這個作爲我的第一個腳本,但老實說,我有點困惑於NodeJS的方法。來自循環的數據正在顯示更多次,我需要它
問題的根源在於我正在做一個嵌套循環。它打印整個數據加上每個人都玩10次的冠軍。
這是請求的部分代碼:
// SUMMONER ID TO FETCH DATA
request.get(`https://lan.api.pvp.net/api/lol/lan/v1.4/summoner/by-name/ronalxo?api_key=${riotKey}`, (err, resp, body) => {
let parseBody = JSON.parse(body);
let summonerID = parseBody.ronalxo.id;
// LIVE GAME
request.get(`https://lan.api.pvp.net/observer-mode/rest/consumer/getSpectatorGameInfo/LA1/${summonerID}?api_key=${riotKey}`, (err, resp, body) => {
let parseBodyGameInfo = JSON.parse(body);
let idsSeen = [];
let championBeingPlayed = [];
for (let t in parseBodyGameInfo.participants) {
championBeingPlayed.push(parseBodyGameInfo.participants[t].championId);
}
//console.log(championBeingPlayed);
// CHAMPION TO COMPARE ID WITH KEY AND SEE IF IT MATCHES THEN DISPLAY THE CHAMPION NAME
// THIS IS A NESTED REQUEST
request.get(`https://global.api.pvp.net/api/lol/static-data/lan/v1.2/champion?api_key=${riotKey}`, (err, resp, body) => {
let parsechampionIds = JSON.parse(body);
for (let x in parsechampionIds.data) {
if (parsechampionIds.data.hasOwnProperty(x)) { // LOOKS FOR ID OF CHARACTER
let championId = parsechampionIds.data[x].id;
if (championBeingPlayed.indexOf(championId) !== -1) { // THE ID FROM ABOVE GETS MATCHED WITH OTHER IDS HERE TO DISPLAY OTHER DATA
for (var i in parseBodyGameInfo.participants) { // CHECKS FOR PARTICIPANTS ON MATCH
if (parseBodyGameInfo.participants[i].teamId === 100) { // CHECKS THE ID OF THE TEAM THAT THE PLAYER BELONGS TO
if (idsSeen.indexOf(parseBodyGameInfo.participants[i].teamId) === -1) { // CHECKS IF TEAM ID IS IN ARRAY
console.log(`***** BLUE TEAM *****`); // I PUT THIS HERE SO IT DISPLAYS ONLY ONCE, NOT 10 TIMES
}
console.log(`${parseBodyGameInfo.participants[i].summonerName} playing ${parsechampionIds.data[x].name}`);
}
idsSeen.push(parseBodyGameInfo.participants[i].teamId);
}
}
}
}
});
});
});
的輸出是這樣的:
Anrez playing Thresh
I AM MIZUKAGE playing Thresh
EriickX playing Thresh
xDBanned playing Thresh
yayobuenavibra playing Thresh
Anrez playing Cho'Gath
I AM MIZUKAGE playing Cho'Gath
EriickX playing Cho'Gath
xDBanned playing Cho'Gath
yayobuenavibra playing Cho'Gath
Anrez playing Xin Zhao
I AM MIZUKAGE playing Xin Zhao
EriickX playing Xin Zhao
xDBanned playing Xin Zhao
yayobuenavibra playing Xin Zhao
正如你可以看到,它打印相同的冠軍5次,因爲有是10,它打印10次。顯然這不是我想要的行爲。我所要的輸出如:
Anrez playing
I AM MIZUKAGE playing Xin zhao
EriickX playing Thresh
xDBanned playing Cho gath
yayobuenavibra playing Tristana
Anrez playing Miss Fortune
哪些人物的名字,所以,我想知道在哪裏放置for循環(除了一個很好的重構,我應該做的)。
這是您的服務器API響應? –
@Łukasz是的,數據正在被正確請求,只是我認爲for循環不應該去那裏,我用父請求更新了代碼。 – bexo
循環需要一些清理,以便更容易理解(儘管我認爲我看到了問題)。例如,你說「for(讓x在parsechampionIds.data中){if(parsechampionIds.data.hasOwnProperty(x)...你已經在parsechampionIds.data中迭代了x.你不必做屬性查找;如果x不存在於parsechampionIds.data中,這永遠不會是真的......等等。我想說的問題是這種混淆導致了這種失敗(索引從未找到),所以它會重複對所有參與者:idsSeen.indexOf(parseBodyGameInfo.participants [i] .teamId –