【问题标题】:jQuery each loop give only first resultjQuery每个循环只给出第一个结果
【发布时间】:2019-07-30 12:08:12
【问题描述】:

我正在尝试生成一个数组以通过 jQuery 提交给 ajax 调用。这是我的 HTML 和 JavaScript:

//Following is the JavaScript I use to generate the variables from checked checkboxes

jQuery(document).on("click", ".refno", function() {
  var ref = jQuery(this).data("ref");
  var refindex = jQuery(this).data("refindex");

  var i = 0;
  var tutelists = [];
  var tutearray = {};
  jQuery('.datarefindex_' + refindex).each(function() {
var subjid = jQuery(this).data("subjid");
i++;

tutearray["id"] = subjid;
tutearray["issuedtutes"] = jQuery("input[name=tuteset_" + refindex + "_" + subjid + "]:checked").map(function() {
  return this.value;
}).get();

  });
  tutelists.push(tutearray);
  var tutelists = JSON.stringify(tutelists);

  jQuery("#responsecontainer").html(tutelists);

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.4/jquery.min.js"></script>
<a href="javascript:void(0)" class="refno" data-refindex="1" data-ref="1105898">1105898</a>
<ul>
  <li>
    <div>Title 1</div>
    <ul class="datarefindex_1" data-subjid="opt471821">
      <li>
        <label class="tutebtn" for="1_opt471821_1">
                            <input name="tuteset_1_opt471821" data-mainrefindex="1" type="checkbox" id="1_opt471821_1" data-subj="opt471821" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt471821_2">
                            <input name="tuteset_1_opt471821" data-mainrefindex="1" type="checkbox" id="1_opt471821_2" data-subj="opt471821" value="2"> 2</label>
      </li>
    </ul>
  </li>
  <li>
    <div>Title 2</div>
    <ul class="datarefindex_1" data-subjid="opt1215754">
      <li>
        <label class="tutebtn" for="1_opt1215754_1">
                            <input name="tuteset_1_opt1215754" data-mainrefindex="1" type="checkbox" id="1_opt1215754_1" data-subj="opt1215754" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt1215754_2">
                            <input name="tuteset_1_opt1215754" data-mainrefindex="1" type="checkbox" id="1_opt1215754_2" data-subj="opt1215754" value="2"> 2</label>
      </li>
    </ul>
  </li>
  <li>
    <div>Title 3</div>
    <ul class="datarefindex_1" data-subjid="opt3062581">
      <li>
        <label class="tutebtn" for="1_opt3062581_1">
                            <input name="tuteset_1_opt3062581" data-mainrefindex="1" type="checkbox" id="1_opt3062581_1" data-subj="opt3062581" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt3062581_2">
                            <input name="tuteset_1_opt3062581" data-mainrefindex="1" type="checkbox" id="1_opt3062581_2" data-subj="opt3062581" value="2"> 2</label>
      </li>
    </ul>
  </li>
</ul>
<div id="responsecontainer"></div

>

我收到的结果如下(我已经检查了每个列表中的前 3 个框);

{"id":"opt3062581","issuedtutes1":["1","2","3"],
"issuedtutes2":["1","2","3"],
"issuedtutes3":["1","2","3"]}

但是想要的结果如下;

{"id":"opt471821","issuedtutes":["1","2","3"]},
{"id":"opt1215754","issuedtutes":["1","2","3"]},
{"id":"opt3062581","issuedtutes":["1","2","3"]}

无法弄清楚我错过了什么。当我从函数中删除id 部分时,这将返回{"id":"opt3062581","issuedtutes":["1","2","3"]},这是最后一个列表中的数据。请帮忙。

tute 列表的数量是动态的,而不是固定的。

【问题讨论】:

  • 在循环内创建tutelists = {},然后将其推送到您应该在循环外创建的数组
  • @CalvinNunes 不走运! [{"id":"opt3062581","issuedtutes1":["1","2","3"],"issuedtutes2":["1","2","3"],"issuedtutes3":["1","2","3"]}]我做了这个之后我尝试了下面两个答案中给出的相同建议
  • 所以,edit 你的问题并添加一个有效的minimal reproducible example,因为现在,你在 sn-p 中的代码没有做任何事情,而且你使用 jQuery(. ..) 不存在...
  • @CalvinNunes 请立即查看

标签: javascript jquery arrays json


【解决方案1】:

您的预期输出看起来像一个对象列表,所以tutelists 应该是一个列表而不是一个对象。

jQuery(document).on("click", ".refno", function() {
  var ref = jQuery(this).data("ref");
  var refindex = jQuery(this).data("refindex");

  var i = 0;
  var tutelists = [];
  jQuery('.datarefindex_' + refindex).each(function() {
var subjid = jQuery(this).data("subjid");
i++;
  var tutearray = {};

tutearray["id"] = subjid;
tutearray["issuedtutes"] = jQuery("input[name=tuteset_" + refindex + "_" + subjid + "]:checked").map(function() {
  return this.value;
}).get();
  tutelists.push(tutearray);

  });
  var tutelists = JSON.stringify(tutelists);

  jQuery("#responsecontainer").html(tutelists);

});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<a href="javascript:void(0)" class="refno" data-refindex="1" data-ref="1105898">1105898</a>
<ul>
  <li>
    <div>Title 1</div>
    <ul class="datarefindex_1" data-subjid="opt471821">
      <li>
        <label class="tutebtn" for="1_opt471821_1">
                            <input name="tuteset_1_opt471821" data-mainrefindex="1" type="checkbox" id="1_opt471821_1" data-subj="opt471821" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt471821_2">
                            <input name="tuteset_1_opt471821" data-mainrefindex="1" type="checkbox" id="1_opt471821_2" data-subj="opt471821" value="2"> 2</label>
      </li>
    </ul>
  </li>
  <li>
    <div>Title 2</div>
    <ul class="datarefindex_1" data-subjid="opt1215754">
      <li>
        <label class="tutebtn" for="1_opt1215754_1">
                            <input name="tuteset_1_opt1215754" data-mainrefindex="1" type="checkbox" id="1_opt1215754_1" data-subj="opt1215754" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt1215754_2">
                            <input name="tuteset_1_opt1215754" data-mainrefindex="1" type="checkbox" id="1_opt1215754_2" data-subj="opt1215754" value="2"> 2</label>
      </li>
    </ul>
  </li>
  <li>
    <div>Title 3</div>
    <ul class="datarefindex_1" data-subjid="opt3062581">
      <li>
        <label class="tutebtn" for="1_opt3062581_1">
                            <input name="tuteset_1_opt3062581" data-mainrefindex="1" type="checkbox" id="1_opt3062581_1" data-subj="opt3062581" value="1"> 1</label>
      </li>
      <li>
        <label class="tutebtn" for="1_opt3062581_2">
                            <input name="tuteset_1_opt3062581" data-mainrefindex="1" type="checkbox" id="1_opt3062581_2" data-subj="opt3062581" value="2"> 2</label>
      </li>
    </ul>
  </li>
</ul>
<div id="responsecontainer"></div

>

【讨论】:

  • 我不认为 temp["issuedtutes"+i] 中的 +i 是期望的结果。
  • 谢谢。但没有运气!我仍然得到的是最后一个列表 ID 和选中的项目数组,不是所有列表。 ;(
  • @Sid 查看我更新的答案,代码需要在每个循环中
【解决方案2】:

您的id 值将被替换为新的值。请尝试使用数组的push()方法使其可行。

jQuery(document).on("click", ".refno", function () {
    var ref = jQuery(this).data("ref");
    var refindex = jQuery(this).data("refindex");

    var i = 0;
    var tutelists =[];
    tutelistElement = {};
    jQuery('.datarefindex_'+ refindex ).each(function(){
        var subjid = jQuery(this).data("subjid");
        i++;

        tutelistElement["id"] = subjid;
        tutelistElement["issuedtutes"+i] = jQuery("input[name=tuteset_"+refindex+"_"+subjid+"]:checked").map(function () { return this.value; }).get();

    });
    tutelists.push(tutelistElement);
    var tutelists = JSON.stringify(tutelists);

    jQuery("#responsecontainer").html(tutelists);

});

【讨论】:

  • 谢谢。但没有运气!我仍然得到的是最后一个列表 ID 和选中的项目数组,不是所有列表。 :( 我也不需要数组中的+i
  • 能否更新您的代码以显示数组结果
  • 对不起,我没明白你的意思。我得到的结果是:O 进行更改时,我得到来自最后一个列表的[{"id":"opt3062581","issuedtutes":["1","2","3"]}]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-11-15
  • 2014-08-27
  • 2014-07-17
  • 2020-04-27
  • 2021-05-05
  • 1970-01-01
  • 2016-03-10
相关资源
最近更新 更多