Javascript 循环中的数据显示的次数比我需要的要多
我正在向API发出一些请求。这是一场比赛。首先,我请求获得一个Id,然后用这个Id我得到一个现场比赛,我提取的是每个人正在玩的角色以及球员的名字。这是我第一个用Python编写的脚本,但老实说,我对NodeJS中的方法有点困惑 问题的根源是我正在做一个嵌套的循环,而且很好。它打印所有数据加上冠军,每个人都玩了10次 这是请求代码的一部分: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
// 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
应该都是小写的啊,我知道了,是的,我查过了,另一个支票丢失了,谢谢你的帮助,并花时间重新创建它。这个代码将是一个很好的候选者,因为我很快会在那里发布它。