2017-01-25 20 views
0

我正在向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循環(除了一個很好的重構,我應該做的)。

+0

這是您的服務器API響應? –

+0

@Łukasz是的,數據正在被正確請求,只是我認爲for循環不應該去那裏,我用父請求更新了代碼。 – bexo

+0

循環需要一些清理,以便更容易理解(儘管我認爲我看到了問題)。例如,你說「for(讓x在parsechampionIds.data中){if(parsechampionIds.data.hasOwnProperty(x)...你已經在parsechampionIds.data中迭代了x.你不必做屬性查找;如果x不存在於parsechampionIds.data中,這永遠不會是真的......等等。我想說的問題是這種混淆導致了這種失敗(索引從未找到),所以它會重複對所有參與者:idsSeen.indexOf(parseBodyGameInfo.participants [i] .teamId –

回答

0

看來是有缺失的檢查,以匹配外championId循環與championId。嘗試添加下面的if語句:

for (let i in parseBodyGameInfo.participants) { // CHECKS FOR PARTICIPANTS ON MATCH 

    //▼▼▼ add this conditional to match the championIds ▼▼▼ 
    if (parseBodyGameInfo.participants[i].championId == championId) { 
      if (parseBodyGameInfo.participants[i].teamId === 100) { // CHECKS THE ID OF THE TEAM THAT THE PLAYER BELONGS TO 
       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); 
    } 
} 

你可以看到this plunker演示 - 在控制檯聲明是在瀏覽器控制檯可見。

+0

啊,我明白了,是的,我檢查了一下,另一張支票丟失了,感謝您的幫助,並花時間重新創建它。 – bexo

+0

此代碼將是[codereview.stackexchange.com](http://codereview.stackexchange.com) –

+0

的一個很好的候選人,我會很快發佈它。 – bexo

相關問題