【问题标题】:How to fix for loop isn’t getting results in string array in JavaScript如何修复 for 循环在 JavaScript 中的字符串数组中没有得到结果
【发布时间】:2018-12-20 15:21:54
【问题描述】:

我正在创建一个音乐播放器,但遇到了 for 循环和数组的问题。我的 main.js 文件中有以下函数

function CreateDatabaseArtists() {
  for (n = 0; n < DatabaseArtists.length+1; n++) {
    if (DatabaseArtists[n.toString()].name === "") {} else {      
      let NewArtistBtn = document.createElement("div");
      NewArtistBtn.id = DatabaseArtists[n].artistgroup;
      // NewArtistBtn.onclick = function() {OpenArtist(NewArtistBtn.id);};
      NewArtistBtn.classList.toggle("column");
      NewArtistBtn.setAttribute("style", "word-wrap: break-word; float: none; width: 150px; text-align:center;align-items:center; display: inline-block; white-space: nowrap; overflow: hidden; text-overflow:ellipsis;");           
      let ArtistIMG = document.createElement("img");
      if (DatabaseArtists[n].ArtistArt == "") {
        ArtistIMG.src = "https://iplock.weebly.com/uploads/9/5/7/3/95731436/p298.png";
        ArtistIMG.style.borderRadius = "50%";
      } else {
        ArtistIMG.src = DatabaseArtists[n].ArtistArt;
        ArtistIMG.style.borderRadius = "50%";
      }
      ArtistIMG.style.width = "150px"; ArtistIMG.style.height = "150px";
      NewArtistBtn.appendChild(ArtistIMG);
      let text = document.createElement("p");
      text.innerHTML = "ahhh-humbug";
      // DatabaseArtists[b].name;
      ArtistIMG.setAttribute("aria-label", text.innerHTML);
      NewArtistBtn.appendChild(text);
      document.getElementById("artists").appendChild(NewArtistBtn);
    }
  }
}

还有带有

的部分
for (n = 0; n < DatabaseArtists.length+1; n++) {
        if (DatabaseArtists[n.toString()].name === "") {}

一直失败,我收到一条错误消息,说它找不到“name”的变量,即使在数组中它是"name": "AJR", "explicit": false, "artistgroup": "ajr", "ArtistArt": "" 我该怎么办?

【问题讨论】:

  • 你能发布实际的错误信息吗? console.log(DatabaseArtists[n.toString()])的输出?
  • 您是否在代码的其他地方初始化了“n”变量?如果你没有,那可能是你的问题。 var n = 0;
  • @LloydNicholson 不,我没有,它是我代码中的第一个也是唯一一个“n”变量。
  • @Samsquanch 错误代码只是“找不到变量 DatabaseArtists[n].name”
  • @RidleyNelson 然后在 for 循环中初始化它。 var n = 0;

标签: javascript arrays string for-loop find


【解决方案1】:
for (n = 0; n < DatabaseArtists.length+1; n++)

您正在遍历数组的末尾,因此最后一个循环将尝试访问undefined 上的name 属性。索引应该从0length - 1

【讨论】:

    【解决方案2】:

    诚实的建议,为什么不拆分应用程序,这样维护起来更容易。此外,如果您使用 forEach 方法,则不必像使用传统的 for 循环那样担心索引。

    const defaultStyle = "word-wrap: break-word; float: " +
      "none; width: 150px; text-align:center;align-items:center; " +
      "display: inline-block; white-space: nowrap; " +
      "overflow: hidden; text-overflow:ellipsis;";
    const defaultImg = 'https://iplock.weebly.com/uploads/9/5/7/3/95731436/p298.png';
    const appRoot = document.getElementById("artists");
    
    
    const createImage = artist => {
      const img = document.createElement("img");
      const source = artist.ArtistArt === '' ? defaultImg : artist.ArtistArt;
    
      img.src = source;
      img.style.borderRadius = "50%";
      img.style.width = "150px";
      img.style.height = "150px";
    
      return img;
    };
    
    
    const createButton = artist => {
      const btn = document.createElement("div");
      const img = createImage(artist);
      const ptag = document.createElement("p");
    
      ptag.innerHTML = "ahhh-humbug";
      btn.id = artist.artistgroup;
      btn.classList.toggle("column");
    
      btn.setAttribute("style", defaultStyle);
      btn.appendChild(img);
      btn.appendChild(ptag);
    
      return btn;
    };
    
    
    const createDatabaseArtists = () => {
      databaseArtists.forEach(artist => {
        if (artist.name !== '') {
          appRoot.appendChild(createButton(artist));
        }
      });
    };
    

    【讨论】:

    • 谢谢!如果不是你,我可能不会考虑使用 forEach 语句。
    • @RidleyNelson 很好,我很高兴能帮上忙! :) 一段时间以来,我一直在努力让自己以更实用的方式编写 JavaScript,并且使用 forEachmap 等方法让生活变得更轻松。
    • 酷。刚刚遇到一个问题,艺人的价值是什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-05
    • 2022-01-20
    • 1970-01-01
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多