【问题标题】:Why the array is created with only the last object from the loop?为什么只使用循环中的最后一个对象创建数组?
【发布时间】:2017-05-21 19:19:32
【问题描述】:

我正在尝试创建一个由对象组成的数组。最重要的是,最后,数组具有相同数量的项目,但它们都是我的最后一个循环对象。这似乎是某种参考。我真的不知道问题出在哪里。

CodePen HTML:

<table class="table table-admin-panel table-bordered">
  <tbody>
    <tr>
      <th>Active</th>
      <th>Name</th>
      <th>Price</th>
      <th>Delete</th>
    </tr>
    <tr>
      <td class="table-admin-panel-active"><input type="checkbox"></td>
      <td> <input class="name" type="text" value="Example 1"></td>
      <td><input type="number" value="10"></td>
      <td class="table-admin-panel-remove"><i class="fa fa-times" aria-hidden="true"></i></td>
    </tr>
    <tr>
      <td class="table-admin-panel-active"><input type="checkbox" checked=""></td>
      <td> <input class="name" type="text" value="Example 2"></td>
      <td><input type="number" value="20"></td>
      <td class="table-admin-panel-remove"><i class="fa fa-times" aria-hidden="true"></i></td>
    </tr>
    <tr>
      <td class="table-admin-panel-active"><input type="checkbox" checked=""></td>
      <td> <input class="name" type="text" value="Example 3"></td>
      <td><input type="number" value="30"></td>
      <td class="table-admin-panel-remove"><i class="fa fa-times" aria-hidden="true"></i></td>
    </tr>
    <tr>
      <td class="table-admin-panel-active"><input type="checkbox" checked=""></td>
      <td> <input class="name" type="text" value="Example 4"></td>
      <td><input type="number" value="40"></td>
      <td class="table-admin-panel-remove"><i class="fa fa-times" aria-hidden="true"></i></td>
    </tr>
  </tbody>
</table>
<div class="buttons">
  <button class="btn-bps btn-save">Zapisz</button>
</div>

CodePen JS:

$(document).ready(function() {
  $(".btn-save").click(function(event) {
    var element = new Object();
    var output = new Array();
    $(this).parent(".buttons").siblings("table").find("tr").each(function(index, el) {
        $(this).find("td input").each(function(index2, el) {
          if (index !== 0) {
            if (index2 === 0) {
              var checkboxStatus = $(this).prop("checked");
              if (checkboxStatus === true) {
                element["active"] = "1";
              } else {
                element["active"] = "0";
              }
            } else if (index2 === 1) {
              element["name"] = $(this).val();
            } else if (index2 === 2) {
              element["value"] = $(this).val();
            }
            element["id"] = index - 1 + "";
          }
        });
        output[index] = element;
      });
      console.log(output);
  });
});

【问题讨论】:

    标签: javascript jquery arrays object array-push


    【解决方案1】:

    您需要在第一个循环内声明元素。现在,您正在用每次迭代覆盖元素对象的值。请参阅下面的代码。

    $(document).ready(function() {
      $(".btn-save").click(function(event) {        
        var output = new Array();
        $(this).parent(".buttons").siblings("table").find("tr").each(function(index, el) {
            var element = new Object(); //NEW ELEMENT LOCATION
            $(this).find("td input").each(function(index2, el) {
              if (index !== 0) {
                if (index2 === 0) {
                  var checkboxStatus = $(this).prop("checked");
                  if (checkboxStatus === true) {
                    element["active"] = "1";
                  } else {
                    element["active"] = "0";
                  }
                } else if (index2 === 1) {
                  element["name"] = $(this).val();
                } else if (index2 === 2) {
                  element["value"] = $(this).val();
                }
                element["id"] = index - 1 + "";
              }
            });
            output[index] = element;
          });
          console.log(output);
      });
    });
    

    【讨论】:

    • 感谢您解决了我的问题。如果它具有相同的名称element,为什么现在是另一个对象?
    • 一切都与范围有关。您最初拥有的元素范围位于循环之外,因此当您访问元素时,您只引用了该对象的一个​​实例。当您将它移到第一个循环中时,它会为每一行创建一个对象的新实例。
    【解决方案2】:

    element 在循环外定义和实例化一次 (.each),并在每次迭代中保持相同的引用。

    尝试在循环内实例化它。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-29
      • 2021-07-31
      • 2015-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-23
      相关资源
      最近更新 更多