输入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 :(得分: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)
有两个错误共同导致无限循环:
filteredList
是对this.myDto.objectList
的引用 - 两个变量都引用同一个对象。当你追加增加filteredList的长度时,你也增加了myDto.objectList的长度。解决这部分问题的方法是使用.slice()方法复制数组。
此外,您正在使用严格比较运算符(!==
)来查找objectToRemoveId。由于id可能存储为数值,并且您在属性上调用.toString(),因此这些值永远不会相等,因此每次循环都会落入if语句。
将两者放在一起,当你遍历数组时,你最终会在每次迭代时为数组添加一个术语。