是什么导致我的javascript语句无限循环?

时间:2010-11-17 16:14:01

标签: javascript

输入for循环时,它永远不会停止:

 remove: function remove(e) {
     var objectToRemoveId = e.currentTarget.getAttribute('objectId').toString();
     var filteredList = this.myDto.objectList;

     for (var index = 0; index < this.myDto.objectList.length; index++) {
          var currentObject = this.myDto.objectList[index];

       if (currentObject.Id !== objectToRemoveId) {
         filteredList[filteredList.length + 1] = timeSheet;
       }
     }
  } 

假设this.myDto.ObjectList是一个包含一个元素的数组。我确定问题只是盯着我看,但我无法弄清楚。

4 个答案:

答案 0 :(得分:9)

您在循环中添加了相同的列表,因此每次循环时,this.myDto.objectList.length都会上升一个。看起来你想要一个空数组:

var filteredList = this.myDto.objectList;

像这样:

var filteredList = [];

或副本,如下:

var filteredList = this.myDto.objectList.slice();

我不确定假设的最终结果是什么,添加到名为filtered的列表会让我失望,但在任何一种情况下,你可能都是在上面的一个解决方案之后

答案 1 :(得分:0)

这是因为你正在修改你正在迭代的列表,每次迭代都会增加它的长度,因此索引总是比数组的长度小1。

混淆可能是因为参考:

var filteredList = this.myDto.objectList;

但是你仍然在循环中使用this.myDto.objectList引用,这可能就是你没有发现它的原因。

答案 2 :(得分:0)

你不能做这样的事情让它不那么混乱吗?

 remove: function remove(e) {
     var objectToRemoveId = e.currentTarget.getAttribute('objectId').toString();
     var filteredList = new Array();

     for (var index = 0; index < this.myDto.objectList.length; index++) {
          var currentObject = this.myDto.objectList[index];

       if (currentObject.Id !== objectToRemoveId) {
         filteredList[index] = timeSheet;
       }
     }
   } 

答案 3 :(得分:0)

有两个错误共同导致无限循环:

  1. filteredList是对this.myDto.objectList的引用 - 两个变量都引用同一个对象。当你追加增加filteredList的长度时,你也增加了myDto.objectList的长度。解决这部分问题的方法是使用.slice()方法复制数组。

  2. 此外,您正在使用严格比较运算符(!==)来查找objectToRemoveId。由于id可能存储为数值,并且您在属性上调用.toString(),因此这些值永远不会相等,因此每次循环都会落入if语句。

  3. 将两者放在一起,当你遍历数组时,你最终会在每次迭代时为数组添加一个术语。