【问题标题】:Loop through array on button click单击按钮时循环遍历数组
【发布时间】:2019-09-02 13:50:27
【问题描述】:

我有一个数组,我通过 json_encode(); 放入我的文件中;从我的 .php 文件中。数组如下所示:

{
  "15800175": {
    "posID": "159469",
    "scanID": "22597",
    "anr": "15800175",
    "TVanr": "",
    "code": "G-09-27-2E",
    "ean": "4710069680575",
    "marke": "fox",
    "bez": "jersey yellow",
    "bez2": "size xl",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "TT9857BG\r\n",
    "Langtext": ""
  },
  "15100027": {
    "posID": "159471",
    "scanID": "22597",
    "anr": "15100027",
    "TVanr": "",
    "code": "G-11-03-2A",
    "ean": "4712511825411",
    "marke": "fox",
    "bez2": "jersey L",
    "menge": "1",
    "ve": "St\u00fcck",
    "Dimensionstext": "blue\r\n",
    "Langtext": ""
  },

我想在一个看起来像这样的表格中显示值

Pos | code | bez | anr | qty | ve

我希望它首先显示数组的第一个位置,这将等于 15800175,对吗?然后当我按下“下一步”按钮时,它应该切换 div,隐藏第一个位置并显示第二个位置的值。

如何通过一键操作来显示相应的值?真的卡在这上面了。 谢谢!

【问题讨论】:

    标签: javascript php html arrays json


    【解决方案1】:

    在 javascript 中,afaik 中的“数组”和您在其中拥有的东西是有区别的,我们称之为“对象”。在 PHP 中,我想它们都被称为“数组”,当您有数组值的键时,它被称为“关联数组”,但在 Javascript 中,我们称这些“对象”以将它们与看起来像的数组区分开来[1,2,3]

    所以第一步是把你的对象变成一个数组。我会这样做:

    var obj = {
      "15800175": {
        "posID": "159469",
        "scanID": "22597",
        "anr": "15800175",
        "TVanr": "",
        "code": "G-09-27-2E",
        "ean": "4710069680575",
        "marke": "fox",
        "bez": "jersey yellow",
        "bez2": "size xl",
        "menge": "1",
        "ve": "St\u00fcck",
        "Dimensionstext": "TT9857BG\r\n",
        "Langtext": ""
      },
      "15100027": {
        "posID": "159471",
        "scanID": "22597",
        "anr": "15100027",
        "TVanr": "",
        "code": "G-11-03-2A",
        "ean": "4712511825411",
        "marke": "fox",
        "bez2": "jersey L",
        "menge": "1",
        "ve": "St\u00fcck",
        "Dimensionstext": "blue\r\n",
        "Langtext": ""
      }
    }
    
    var arr = Object.keys(obj).map(key => obj[key]);
    

    最后是 arr 看起来像:

    [{"posID":"159471","scanID":"22597","anr":"15100027","TVanr":"","code":"G-11-03-2A","ean":"4712511825411","marke":"fox","bez2":"jersey L","menge":"1","ve":"Stück","Dimensionstext":"blue\r\n","Langtext":""},{"posID":"159469","scanID":"22597","anr":"15800175","TVanr":"","code":"G-09-27-2E","ean":"4710069680575","marke":"fox","bez":"jersey yellow","bez2":"size xl","menge":"1","ve":"Stück","Dimensionstext":"TT9857BG\r\n","Langtext":""}]
    

    然后,您可以使用 forEach 回调 arr.forEach(item => {}); 遍历 arr 中的每个对象,然后随意渲染它们。

    【讨论】:

    • 感谢您的回复。但是,如何一次只显示一个对象并通过单击按钮显示下一个对象?
    • 好吧,您有一些状态来存储您所在的索引,然后当发生按钮单击时,您将索引增加 1,获取该索引处的对象,然后渲染该对象。可能涉及模数计算,以便在超过数组长度时返回到索引 0。
    【解决方案2】:

    您好,这里使用@Tkol 方法是一种将元素一一添加到您的 html 表的解决方案;

    html:

    var obj = {
      "15800175": {
        "posID": "159469",
        "scanID": "22597",
        "anr": "15800175",
        "TVanr": "",
        "code": "G-09-27-2E",
        "ean": "4710069680575",
        "marke": "fox",
        "bez": "jersey yellow",
        "bez2": "size xl",
        "menge": "1",
        "ve": "St\u00fcck",
        "Dimensionstext": "TT9857BG\r\n",
        "Langtext": ""
      },
      "15100027": {
        "posID": "159471",
        "scanID": "22597",
        "anr": "15100027",
        "TVanr": "",
        "code": "G-11-03-2A",
        "ean": "4712511825411",
        "marke": "fox",
        "bez2": "jersey L",
        "menge": "1",
        "ve": "St\u00fcck",
        "Dimensionstext": "blue\r\n",
        "Langtext": ""
      }
    }
    var counter = 0;
    var arr = Object.keys(obj).map(key => obj[key]);
    document.getElementById("btnAdd").onclick = function(event){
    //variables
    let tbody = document.getElementById("tbodyExample");
    
    //logic
    let element  = arr[counter] != undefined ? arr[counter] : undefined;
    if(element !== undefined){
    var row = document.createElement('tr');//'<tr id="'+element.posID+'"></tr>';
      row.setAttribute("id",element.posID);
      row.innerHTML = '<td>'+element.posID+'</td><td>'+element.code+'</td><td>'+(element.bez == undefined? element.bez2 : element.bez)+'</td><td>'+element.anr+'</td><td>'+element.menge+'</td><td>'+element.ve+'</td>';
      tbody.appendChild(row);
      counter++;
    }else{
    alert("No more items found");
    }
    }
    <h2>Table example</h2>
    <table id="example" border=1>
      <thead>
        <th>Post</th>
        <th>code</th>
        <th>bez</th>
        <th>anr</th>
        <th>qty</th>
        <th>ve</th>
      </thead>
      <tbody id="tbodyExample">
        
      </tbody>
    </table>
    <br>
    <input type="button" id="btnAdd" value="add Row">

    希望对你有帮助

    【讨论】:

    • 谢谢!!这正是我想要的。现在我想在单击按钮时将第一个元素替换为第二个元素,依此类推。
    • 另一个问题,当我点击下一个按钮时,它首先显示第二个键(“15100027”),而不是按常规顺序显示对象。我该如何解决?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-11-05
    • 1970-01-01
    • 2019-10-20
    • 2019-09-24
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多