【问题标题】:JavaScript for loop iterates too many times through arrayJavaScript for 循环通过数组迭代太多次
【发布时间】:2018-07-25 22:56:26
【问题描述】:

我从last question 继续我的项目。
现在它几乎可以按照我想要的方式完成所有工作。

本网站的基本功能是遍历 World Of Tanks API 以创建显示我们氏族拥有的省份的卡片。

因此,我使用以下 for 循环来创建卡片。

function loopProvince(provinces, jsonData) {
  for (i = 0; i < provinces.length; i++) {
    createCard(i);
    getMaps(jsonData[clan_id][i].arena_id, i);
    changeProvinceDetails(jsonData[clan_id], i + 1);
  }
}

这里的问题是,如果我们拥有 15 个省份(因此脚本应该生成 15 张卡片),它会创建 15 张填充卡片和第 16 张空白卡片。
我想知道如何才能删除第 16 张卡片或完全停止创建它。

完整代码为:

//var clan_id = 500071433;
var clan_id = 500025989; // FAME

// Get province ID
//TODO: ein Feld zu viel --> Entfernen
var province_list = "https://api.worldoftanks.eu/wot/globalmap/clanprovinces/?application_id=bbdd3a54ffe280ff581db61299acab9c&clan_id=" + clan_id + "&fields=province_name%2C+province_id%2C+arena_id%2C+clan_id%2C+daily_revenue%2C+max_vehicle_level%2C+prime_time%2C+front_id";
// Get JSON Data



fetch(province_list)
  .then(res => res.json())
  .then((out) => {
    loopProvince(out.data[clan_id], out.data);

  })
  .catch(err => {
    throw err
  });



function loopProvince(provinces, jsonData) {
  for (i = 0; i < provinces.length; i++) {
    createCard(i);
    getMaps(jsonData[clan_id][i].arena_id, i);
    changeProvinceDetails(jsonData[clan_id], i + 1);
  }
}

function createCard(i) {
  var card = `
  <div class="province" id="province` + (i + 1) + `">
    <div class="province_title" id="province_name` + (i + 1) + `">
      <h2>Provinz ` + (i + 1) + `</h2>
    </div>
    <div class="province_information">
      <div class="map_name" id="province_map` + (i + 1) + `">
        <p>Map Name</p>
      </div>
      <div class="details">
        <div class="time" id="province_time` + (i + 1) + `">
          <p>Prime Time: XX:XX Uhr</p>
        </div>
        <div class="tier" id="province_tier` + (i + 1) + `">
          <p>Stufe: X</p>
        </div>
        <div class="income" id="province_income` + (i + 1) + `">
          <p>Einkommen: X/Tag</p>
        </div>
      </div>  <!-- details -->
    </div>
  </div>
  `;

  document.getElementById('contentid').innerHTML += card;
}

function getMaps(arena_id, i) {
  fetch('./data/maps.json')
    .then((res) => res.json())
    .then((jsonMap) => {
      changeProvinceMap(jsonMap.data[arena_id].name_i18n, jsonMap.data[arena_id].minimap_location, i);
    })
}

// start changing information

function changeProvinceDetails(json, i) {
  changeProvinceName(json[i].province_name, i);
  changeProvinceIncome(json[i].daily_revenue, i);
  changeProvinceTier(json[i].max_vehicle_level, i);
  changeProvinceTime(json[i].prime_time, i);
}

function changeProvinceName(province_name, i) {
  document.getElementById("province_name" + i).innerHTML = "<h2>" + province_name + "</h2>";
}

function changeProvinceMap(province_map, province_minimap, i) {
  document.getElementById("province_map" + i).innerHTML = "<p>" + province_map + "</p>";
  document.getElementById("province_map" + i).setAttribute("style", "background:url(" + province_minimap + "); background-size:cover; background-position:center;");
}

function changeProvinceIncome(province_income, i) {
  document.getElementById("province_income" + i).innerHTML = "<p>Einkommen: " + province_income + " / Tag </p>";
}

function changeProvinceTier(province_tier, i) {
  document.getElementById("province_tier" + i).innerHTML = "<p>Stufe: " + province_tier + "</p>";
}

function changeProvinceTime(province_prime_time, i) {
  document.getElementById("province_time" + i).innerHTML = "<p>Prime Time: " + province_prime_time + " Uhr</p>";
}
body {
  background: #EBEBEB;
  font-family: sans-serif;
  color: #343434;
}

.container {
  display: grid;
  grid-template-rows: auto 1fr auto;
  grid-template-areas: "head" "information" "copyright";
  height: 100vh;
  grid-gap: 50px;
}

header {
  display: grid;
  background: #343434;
  border-bottom: #ACACAC 5px solid;
}

#title {
  grid-area: head;
  padding: 20px;
  font-size: 20px;
  text-transform: uppercase;
  font-weight: bold;
  color: #ffffff;
}

.content {
  grid-area: information;
  display: grid;
  grid-template-columns: repeat(auto-fit, minmax(600px, 1fr));
  grid-gap: 20px;
  align-items: start;
}

.province {
  background: #ACACAC;
  display: grid;
  grid-template-rows: auto 300px;
}

.province_title {
  display: grid;
  align-items: center;
  justify-items: center;
  background: #343434;
  color: #ffffff;
}

.province_information {
  height: minmax(200px, auto);
  display: grid;
  grid-template-columns: 1fr 1fr;
  grid-template-areas: "map details";
}

.province_information p {
  margin: 0;
  padding: 0;
}

.province_information .map_name {
  grid-area: map;
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: center;
  text-transform: uppercase;
  font-weight: bold;
  color: #343434;
  background: white;
  background-position: center;
  background-size: cover;
}

.province_information .map_name>p {
  background: #ffffff;
  padding: 5px;
}

.province_information .details {
  grid-area: details;
  padding: 10px;
  padding-right: 0;
  display: grid;
  grid-gap: 5px;
  align-items: center;
}

.province_information .details .time {
  font-weight: bold;
  text-align: center;
  font-size: 20px;
}

footer {
  padding: 10px;
  gird-area: copyright;
  background: #343434;
  border-top: #ACACAC 3px solid;
  color: #ffffff;
}


/*
          __  __          _ _
    ____ |  \/  |        | (_)
   / __ \| \  / | ___  __| |_  __ _
  / / _` | |\/| |/ _ \/ _` | |/ _` |
 | | (_| | |  | |  __/ (_| | | (_| |
  \ \__,_|_|  |_|\___|\__,_|_|\__,_|
   \____/
  */

@media (max-width: 600px) {
  .container {
    grid-gap: 20px;
  }
  .content {
    grid-area: information;
    display: grid;
    grid-template-columns: minmax(70%, 1fr);
    grid-gap: 20px;
    align-items: start;
    justify-items: stretch;
  }
  .province_information {
    height: minmax(200px, auto);
    display: grid;
    grid-template-columns: 1fr;
    grid-template-row: 1fr 1fr;
    grid-template-areas: "map" "details";
  }
  #title {
    text-align: center;
  }
}
<!DOCTYPE html>
<html lang="en">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>WOT Clan Wars Dashboard</title>
  <link rel="stylesheet" href="css/style.css">
  <script type="text/javascript" src="javascript/main.js"></script>
</head>

<body>
  <div class="container">
    <header "head">
      <div id="title">
        <h1>Clan Wars Dashboard</h1>
      </div>
    </header>
    <div class="content" id="contentid">
      <!-- generated by JavaScript -->
    </div>
    <!-- content -->

    <footer>
      Copyright &copy; 2018 Kay Kleinvogel
    </footer>
  </div>

</body>

</html>

背景图片在这里无法使用,因为它们保存在本地。
对于包括 maps.json 和图像在内的所有文件,只需查看Github page

如果代码混乱,我很抱歉,因为这是我的第一个比基础教程更大的网络项目。

感谢您的帮助:)

【问题讨论】:

    标签: javascript html json api for-loop


    【解决方案1】:

    您实际上有 16 个来自 API 的地图。问题是您在设置每张卡片的详细信息时跳过了第一个。

    changeProvinceDetails(jsonData[clan_id], i + 1);
    

    那里的i+1 跳过了第一个索引。当您从 json 中获取信息时,您可以通过减去一个来弥补这一点。

    function changeProvinceDetails(json, i) {
      changeProvinceName(json[i-1].province_name, i);
      changeProvinceIncome(json[i-1].daily_revenue, i);
      changeProvinceTier(json[i-1].max_vehicle_level, i);
      changeProvinceTime(json[i-1].prime_time, i);
    }
    

    【讨论】:

      【解决方案2】:

      您是否尝试过执行“i

      【讨论】:

      • 它适用于文本和信息,但地图名称和背景图像不会改变
      【解决方案3】:

      数组是从零开始的,因此您的数组索引从 0 到 14 运行。 length 属性为 15,因此您的 for 循环一直在运行,直到它在索引 15 处查找项目。

      如果对这些事情有疑问,请在循环中运行 console.log(i) 语句,您将看到它返回的所有内容的索引。

      希望有所帮助:-)

      【讨论】:

        【解决方案4】:

        固定:

        function loopProvince(provinces, jsonData) {
          for (i = 0; i < provinces.length; i++) {
            createCard(i);
            getMaps(jsonData[clan_id][i].arena_id, i+1);
            changeProvinceDetails(jsonData[clan_id], i+1);
          }
        }
        

        function changeProvinceDetails(json, i) {
          changeProvinceName(json[i-1].province_name, i);
          changeProvinceIncome(json[i-1].daily_revenue, i);
          changeProvinceTier(json[i-1].max_vehicle_level, i);
          changeProvinceTime(json[i-1].prime_time, i);
        }
        

        解决问题。 我将 i+1 用于省详细信息,但不适用于 getMaps。 我应该使用rubber duck method。 还是谢谢大家。

        【讨论】:

        • 虽然有16个省。请注意“Milan”如何作为第一个元素出现在 JSON 中,但“Gap”是您页面上的第一张卡片。
        猜你喜欢
        • 2018-12-18
        • 1970-01-01
        • 2014-10-11
        • 2023-02-23
        • 2013-03-23
        • 2014-11-29
        • 2015-06-09
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多