【问题标题】:How to create loop that populates an HTML table with a Javascript array如何创建使用 Javascript 数组填充 HTML 表的循环
【发布时间】:2020-01-18 07:35:35
【问题描述】:

我的任务是使用 javascript 数组填充 HTML 表格,但我在理解如何让我的数组填充实际的 HTML 表格时遇到了很多麻烦。我必须创建一个包含 5 个菜单项图像、5 个菜单项描述和 5 个价格的表。我在下面提供了我的数组,但不知道我需要执行哪些函数来获取数组以填充 HTML 表。你建议我怎么做才能让它们填充到 HTML 表格中?

另外,根据分配,我必须使用一个数字数组来存储价格,并使用一个字符串数组来存储图像文件。

我想我必须执行某种“for”循环,但我不确定。

感谢您的所有帮助,请告诉我如何完善这个问题。

谢谢,

//my arrays

var item = ["Chicken soup", "Chicken tacos", "Chicken quesadilla", "Chicken burrito", "Chicken enchilada"];

var itemDescription = ["Delicious creamy chicken soup", "Homemade tacos", "Cheesy chicken quesadillas", "Hearty stuffed chicken burrito", "World famous chicken enchilada"];

var itemPrice = [14.99, 17.99, 15.75, 22.95, 12.55];

var imgArray = new Array();

imgArray[0] = new Image();
imgArray[0].src = 'chickensoup.jpg';

imgArray[1] = new Image();
imgArray[1].src = 'chickentaco.jpg';

imgArray[2] = new Image();
imgArray[2].src = 'chickenque.jpg';

imgArray[3] = new Image();
imgArray[3].src = 'chickenburrito.jpg';

imgArray[4] = new Image();
imgArray[4].src = 'chickenenchilada.jpg';

【问题讨论】:

标签: javascript html arrays html-table populate


【解决方案1】:

我不会显示整个代码,但这是逻辑上执行此操作的最佳方法

//JS
let array = ["item 1", "item2"];

//start a string (of html)
let htmlDisplayed = "<div id='htmlString'><ul>";

//loop each array item as a list item
for (let i=0; i< array.length; i++) {
  htmlDisplayed = htmlDisplayed.concat(`<li>${array[i]}</li>`);
}

//close your html tags off
htmlDisplayed = htmlDisplayed.concat("</ul></div>");

//display it
document.getElementById("yourElement").innerHTML = htmlDisplayed;

【讨论】:

    【解决方案2】:

    试试这个:

    let itemObject = [];
    
    itemObject.push({
        item: 'Chicken soup',
        description: 'Delicious creamy chicken soup',
        price: 14.99,
        image: 'chickensoup.jpg'
    });
    itemObject.push({
        item: 'Chicken tacos',
        description: 'Chicken taco',
        price: 17.99,
        image: 'chickentaco.jpg'
    });
    itemObject.push({
        item: 'Chicken quesadilla',
        description: 'Chicken quesadilla',
        price: 15.75,
        image: 'chickenque.jpg'
    });
    itemObject.push({
        item: 'Chicken burrito',
        description: 'Chicken burrito',
        price: 22.95,
        image: 'chickenburrito.jpg'
    });
    itemObject.push({
        item: 'Chicken enchilada',
        description: 'Chicken enchilada',
        price: 12.55,
        image: 'chickenenchilada.jpg'
    });
    
    
    let tbody = document.getElementById('tbody');
    
    for (let rows of itemObject) {
        let tr = document.createElement('TR');
        let td, tdText;
        for (let value of Object.values(rows)) {
            td = document.createElement("TD");
            td.appendChild(document.createTextNode(value));
            tr.appendChild(td);
        }
        tbody.appendChild(tr);
    };
    <table>
       <thead>
          <tr>
             <td>Item</td>
             <td>Description</td>
             <td>Price</td>
             <td>Image</td>
          </tr>
       </thead>
       <tbody id="tbody">
       </tbody>
    </table>

    【讨论】:

    • Object.keys 部分是多余的。您可以立即使用forEach
    • 您好@Nerdvoso,我不确定您提供的代码是否有效,不是因为我使用了 nickzoum 提供的代码,它解决了我正在处理的问题。感谢您花时间帮助我解决这个问题。
    • @ImCanaan 安静,我想给出我自己的版本来解决问题。也许它会引起其他人的兴趣。
    • @nickzoum 我已修改,感谢建设性信号
    • @Nerdvoso 您仍在使用in 而不是of。你这样做是为了 ES5 兼容性吗?
    【解决方案3】:

    对于初学者,我建议将数组合并为一个,以避免任何有关索引的错误。

    标准的html格式是这样的:

    <table>
        <thead>
            <tr>
                <th>name</th>
                <th>description</th>
                <th>price</th>
                <th>imageSrc</th>
            </tr>
        </thead>
        <tbody>
            <tr>
                <td>Chicken soup</td>
                <td>Delicious creamy chicken soup</td>
                <td>14.99</td>
                <td><img src="chickensoup.jpg" alt="chickensoup.jpg"></td>
            </tr>
        </tbody>
    </table>
    

    所以你需要一个循环来打印所有的标题。 您需要一个循环来为每个项目创建不同的行。 您需要在行循环中的最后一个循环将每个单元格(食物属性)添加到行中。

    var items = [{
      name: "Chicken soup",
      description: "Delicious creamy chicken soup",
      price: 14.99,
      imageSrc: "chickensoup.jpg"
    }, {
      name: "Chicken tacos",
      description: "Homemade tacos",
      price: 17.99,
      imageSrc: "chickentaco.jpg"
    }, {
      name: "Chicken quesadilla",
      description: "Cheesy chicken quesadillas",
      price: 15.75,
      imageSrc: "chickenque.jpg"
    }, {
      name: "Chicken burrito",
      description: "Hearty stuffed chicken burrito",
      price: 22.95,
      imageSrc: "chickenburrito.jpg"
    }, {
      name: "Chicken enchilada",
      description: "World famous chicken enchilada",
      price: 12.55,
      imageSrc: "chickenenchilada.jpg"
    }];
    
    var propertyList = ["name", "description", "price", "imageSrc"];
    
    var table = document.createElement("table");
    var tableHeader = document.createElement("thead");
    var tableHeaderRow = document.createElement("tr");
    var tableBody = document.createElement("tbody");
    
    table.setAttribute("border", "1");
    
    document.body.appendChild(table);
    table.appendChild(tableHeader);
    tableHeader.appendChild(tableHeaderRow);
    table.appendChild(tableBody);
    
    propertyList.forEach(function(key) {
      var headerCell = document.createElement("th");
      tableHeaderRow.appendChild(headerCell);
      headerCell.textContent = key;
    });
    
    
    items.forEach(function(foodItem) {
      var foodRow = document.createElement("tr");
      tableBody.appendChild(foodRow);
      propertyList.forEach(function(propertyName) {
        var foodProperty = document.createElement("td");
        foodRow.appendChild(foodProperty);
        if (propertyName === "imageSrc") {
          var image = document.createElement("img");
          foodProperty.appendChild(image);
          image.src = foodItem[propertyName];
          image.alt = foodItem[propertyName];
        } else {
          foodProperty.textContent = foodItem[propertyName];
        }
      });
    });

    如果你不能合并数组,那么你可以使用它来代替。

    var item = ["Chicken soup", "Chicken tacos", "Chicken quesadilla", "Chicken burrito", "Chicken enchilada"];
    
    var itemDescription = ["Delicious creamy chicken soup", "Homemade tacos", "Cheesy chicken quesadillas", "Hearty stuffed chicken burrito", "World famous chicken enchilada"];
    
    var itemPrice = [14.99, 17.99, 15.75, 22.95, 12.55];
    
    var imgArray = new Array();
    
    imgArray[0] = new Image();
    imgArray[0].src = 'chickensoup.jpg';
    
    imgArray[1] = new Image();
    imgArray[1].src = 'chickentaco.jpg';
    
    imgArray[2] = new Image();
    imgArray[2].src = 'chickenque.jpg';
    
    imgArray[3] = new Image();
    imgArray[3].src = 'chickenburrito.jpg';
    
    imgArray[4] = new Image();
    imgArray[4].src = 'chickenenchilada.jpg';
    
    var foodList = {
      name: item,
      description: itemDescription,
      price: itemPrice,
      imageSrc: imgArray
    };
    
    var propertyList = ["name", "description", "price", "imageSrc"];
    
    var table = document.createElement("table");
    var tableHeader = document.createElement("thead");
    var tableHeaderRow = document.createElement("tr");
    var tableBody = document.createElement("tbody");
    
    table.setAttribute("border", "1");
    
    document.body.appendChild(table);
    table.appendChild(tableHeader);
    tableHeader.appendChild(tableHeaderRow);
    table.appendChild(tableBody);
    
    propertyList.forEach(function(key) {
      var headerCell = document.createElement("th");
      tableHeaderRow.appendChild(headerCell);
      headerCell.textContent = key;
    });
    
    for (var index = 0; index < item.length; index++) {
    
      var foodRow = document.createElement("tr");
      tableBody.appendChild(foodRow);
      propertyList.forEach(function(propertyName) {
        var foodProperty = document.createElement("td");
        foodRow.appendChild(foodProperty);
        if (propertyName === "imageSrc") {
          foodProperty.appendChild(foodList[propertyName][index]);
        } else {
          foodProperty.textContent = foodList[propertyName][index];
        }
      });
    }

    【讨论】:

    • 您好 nick zoum,您的代码运行良好。我将它放入我的 .js 文件中,它完全显示了它应该如何显示。不幸的是,这是我的错,因为我没有澄清,我的任务是使用数字数组作为图像文件的价格字符串数组,所以我不能将所有数组串成一个。这有意义吗?你有其他推荐吗?感谢您的所有帮助。
    • @ImCanaan 我在答案中添加了第二个示例
    • @ImCanaan 很高兴能帮上忙。如果您需要有关代码的任何进一步说明,请告诉我。
    【解决方案4】:

    查看这个小提琴链接https://jsfiddle.net/j5mnto3g/2/

    在 Html 中创建表格

    <table border="1">
      <thead>
        <tr><th>Item Image</th><th>Item Name</th><th>Description</th><th>Price</th></tr>
      </thead>
      <tbody id="tbl-body"> </tbody>
    </table>
    

    并通过一个简单的for循环在表中添加行

    var item = ["Chicken soup", "Chicken tacos", "Chicken quesadilla", "Chicken burrito", 
                "Chicken enchilada"];
    
    var itemDescription = ["Delicious creamy chicken soup", "Homemade tacos", "Cheesy chicken quesadillas", "Hearty stuffed chicken burrito", "World famous chicken enchilada"];
    
    var itemPrice = [14.99, 17.99, 15.75, 22.95, 12.55];
    
    var imgArray = new Array();
    
    imgArray[0] = new Image();
    imgArray[0].src = 'chickensoup.jpg';
    
    imgArray[1] = new Image();
    imgArray[1].src = 'chickentaco.jpg';
    
    imgArray[2] = new Image();
    imgArray[2].src = 'chickenque.jpg';
    
    imgArray[3] = new Image();
    imgArray[3].src = 'chickenburrito.jpg';
    
    imgArray[4] = new Image();
    imgArray[4].src = 'chickenenchilada.jpg';
    var rows = '';
    for(i = 0; i < item.length; i++){
        rows += '<tr><td><img src="'+imgArray[i]+'" width="20" height="20"></td><td>'+item[i]+'</td><td>'+itemDescription[i]+'</td><td>'+itemPrice[i]+'</td></tr>';
    }
    document.getElementById('tbl-body').innerHTML = rows;
    

    使用正确的图片路径和大小

    【讨论】:

    • 你好@Avi我不知道为什么,但这并没有解决它。 nickzoum 在上面提供了一个确实可以解决问题的示例。谢谢您的帮助。感谢您抽出宝贵时间提供帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-30
    • 2020-05-11
    • 2021-09-03
    • 2015-02-04
    • 2017-08-06
    相关资源
    最近更新 更多