2010-11-17 73 views
1

当输入的for循环,它从不停止:什么导致我的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是在它的一个元件的阵列。我敢肯定,问题只是盯着我,但我无法弄清楚。

+0

您可以尝试在'for'循环的开始处设置一个带'index'变量值的alert语句 – 2010-11-17 16:17:54

回答

9

您正在添加到您的循环中的同一个列表,所以每次循环时,您的this.myDto.objectList.length都会增加一个。好像你希望空数组这里:

var filteredList = this.myDto.objectList; 

像这样:

var filteredList = []; 

或复印件,这样的:

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

我不知道到底结果是应该是,添加到一个名为filtered的列表正在抛弃我,但无论哪种情况,您都可能在上面的解决方案之一之后。

+0

@chum - 我不确定*完全是*后面的内容,但是要克隆它将是:'var filteredList = this.myDto.objectList.slice();' – 2010-11-17 16:17:20

+0

糟糕,并不意味着删除我的评论,只是编辑它。我的意思是创建一个与我的objectList大小相同的数组,并且我正在做一个大脑放屁。var filteredList = [];工作也一样,我一直忘记,在JavaScript中你不必声明一个数组长度。 – 2010-11-17 16:21:19

0

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

的混乱可能是因为参考:

var filteredList = this.myDto.objectList; 

但是你仍然在使用的循环,这可能是为什么你没有发现它的this.myDto.objectList参考。

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; 
     } 
    } 
    } 
0

有两个错误,它们一起使所述无限循环:

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

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

将两者放在一起,并且在循环遍历数组时,最终会在每次迭代中向数组中添加一个项。