Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 循环中的数据显示的次数比我需要的要多_Javascript_Node.js_Pvp.net Api - Fatal编程技术网

Javascript 循环中的数据显示的次数比我需要的要多

Javascript 循环中的数据显示的次数比我需要的要多,javascript,node.js,pvp.net-api,Javascript,Node.js,Pvp.net Api,我正在向API发出一些请求。这是一场比赛。首先,我请求获得一个Id,然后用这个Id我得到一个现场比赛,我提取的是每个人正在玩的角色以及球员的名字。这是我第一个用Python编写的脚本,但老实说,我对NodeJS中的方法有点困惑 问题的根源是我正在做一个嵌套的循环,而且很好。它打印所有数据加上冠军,每个人都玩了10次 这是请求代码的一部分: // SUMMONER ID TO FETCH DATA request.get(`https://lan.api.pvp.net/api/lol/lan/v

我正在向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循环放在哪里(除了我应该进行的良好重构)。

似乎缺少一个将外部for循环的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);
     }
}

您可以在中看到演示-控制台语句在浏览器控制台中可见。

这是您的服务器API响应?@ukasz是的,数据请求正确,只是我认为for循环不应该出现在那里,我用父请求更新了代码。循环需要一些清理,以便更容易理解(我想我看到了问题所在)例如,你说“For(让x在parsechampionIds.data中){if(parsechampionIds.data.hasOwnProperty(x)…您已经在parsechampionIds.data中迭代了x。您不必执行属性查找;如果parsechampionIds.data中不存在x,这将永远不会为真…等等。我想说的是,问题是这种混乱导致此操作失败(找不到索引),因此它会对所有参与者反复进行:idsSeen.indexOf(parseBodyGameInfo.participants[i].teamIdHmm,请问@SamOnela我到底需要在games.json上更新什么?这不只是来自现场比赛的数据吗?哦,对不起,@SamOnela我实际上是在lolnexus上寻找比赛并使用他们的名字。召唤id来自一个召唤者的请求并获取他们的id。我再次更新了代码,很抱歉造成混淆。在哪里(在上面的代码中)ronalxo是我使用的召唤师,你可以从中获得另一个正在使用的召唤师。
召唤师ID
应该都是小写的啊,我知道了,是的,我查过了,另一个支票丢失了,谢谢你的帮助,并花时间重新创建它。这个代码将是一个很好的候选者,因为我很快会在那里发布它。