使用.push停止循环执行

时间:2017-07-13 13:54:22

标签: javascript arrays

当我尝试推送到数组时,我有一个for循环突然停止工作。描述正在发生的事情的最好方法就是展示我的代码并尝试解释发生了什么。



for (var i = 0; i < childs.length; i++) {
  if (childs[i].length > 0) {
    for (var j = 0; j < amountsValue[i].options.custValues.length; j++) {
      var label = amountsValue[i].options.custValues[j].label;
      var value = amountsValue[i].options.custValues[j].value;

      for (var k = childs[i].length - 1; k >= 0; k--) {
        if (childs[i][k].attributes[label] != value) {
          childBackup.push(childs[i][k]);
          childs[i].splice(k, 1);
        }
      }
    }
    amountsValue[i].id = childs[i][0].attributes.internalid;
    childs.push(childBackup);
  }
}
&#13;
&#13;
&#13;

发生的事情是我正在遍历一系列项目,这些项目可能有也可能没有自定义选项,例如不同的大小或颜色。循环将检查是否有任何从数组中获取值和标签。

在此之后,我们再次循环以尝试将值与存储在单独模型中的选项值进行匹配。计划是检查值是否与存储的值相同,如果不是,则将其与数组进行拼接。消除过程最终应该只留下一个选项,并将用于获取internalid。

在此期间,保留拼接对象的备份,以便可以将它们再次附加到阵列,以便用户可以更改所需的选项。问题是使用childs.push(childBackup)停止浏览器表单读取amountValue上的选项。如果代码被删除或者被推送到另一个索引中,这就行了,所以我真的不确定它为什么不起作用。

有没有人对如何使这项工作有任何建议?对不起,如果这没有多大意义,我已经尽力解释,但是如果有任何事情需要澄清,请告诉我。

编辑:我已经解决了这个问题。感谢所有提出解决问题方法的人。正如其他人所说,我试图操纵我循环的数组并改变它的长度。因此,部分代码是在循环外部进行的,在初始循环之后,另一个循环被设置,其中包含以下代码:

&#13;
&#13;
for (var i = 0; i < childBackup.length; i++) {
  childs[0].push(childBackup[i]);
}
&#13;
&#13;
&#13;

它现在按预期工作。谢谢。

1 个答案:

答案 0 :(得分:0)

您正在操纵正在循环的阵列。

var count = childs.length;
for (var i = 0; i < count; i++) {
  if (childs[i].length > 0) {
    for (var j = 0; j < amountsValue[i].options.custValues.length; j++) {
      var label = amountsValue[i].options.custValues[j].label;
      var value = amountsValue[i].options.custValues[j].value;

      for (var k = childs[i].length - 1; k >= 0; k--) {
        if (childs[i][k].attributes[label] != value) {
          childBackup.push(childs[i][k]);
          childs[i].splice(k, 1);
        }
      }
    }
    amountsValue[i].id = childs[i][0].attributes.internalid;
    childs.push(childBackup);
  }
}