无法使用splice删除数组中的元素

我正在迭代一个数组,并根据一个条件,我想根据索引(目前我使用)从该数组中删除特定元素 。 以下是我的代码,它正如预期的那样完美运行。

var todayWeekNo = new Date().getWeek(); $.each(arr, function (i, j) { var isEqual = todayWeekNo == new Date(j.Date).getWeek(); if (isEqual) { delete arr[i]; } }); 

你可以看到这个工作小提琴

在寻找更好的方法的同时,我开始了解这一点

删除不会从数组中删除元素,它只会将元素设置为undefined。

所以我更换了delete arr[i];arr.splice(i, 1);

对于前2次迭代,它工作正常,而它在最后一次迭代时卡住了。

下面是控制台消息( jsfiddle ):

 index0 arr: [object Object] (index):43 index1 arr: [object Object] (index):43 index2 arr: undefined (index):43 Uncaught TypeError: Cannot read property 'Date' of undefined 

请详细说明这个问题。

如果要从数组中删除元素,则需要确保索引仍匹配:

 var arr = [0,1,2,3]; var index = 1; arr[index] // 1 arr.splice(index,1); index++; arr[index] // 3 (2 was skipped, because arr[1] === 2 after splice) 

解:

 for (var i=0; i 

看起来$ .each()不处理数组的修改

 var todayWeekNo = new Date().getWeek(); for (var i = 0; i < arr.length;) { console.log("index" + i + " arr: " + arr[i]); var isEqual = todayWeekNo == new Date(arr[i].Date).getWeek(); if (isEqual) { arr.splice(i, 1); } else { i++; } } 

演示: 小提琴

您正在使用循环从数组中删除元素。

在这里,当你到达i = 2时,数组只剩下一个元素。 所以,它返回undefined。

$ .each显然没有处理数组的修改,我不确定(i

 for (i in arr) { console.log("index" + i + " arr: " + arr[i]); var isEqual = todayWeekNo == new Date(arr[i].Date).getWeek(); if (isEqual) { arr.splice(i, 1); } }