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

时间:2013-11-21 16:06:28

标签: javascript jquery arrays

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

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

您可以看到此working fiddle

在寻找更好的方法时,我开始知道

  

Delete won't remove the element from the array it will only set the element as 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

请详细说明这个问题。

4 个答案:

答案 0 :(得分:0)

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

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<arr.length; i++) {
  if (cond) {
    arr.splice(i,1);
    i--;
  }
}

答案 1 :(得分:0)

看起来$ .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++;
    }
}

演示:Fiddle

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

$。每个人都没有处理数组的修改,我不确定(i&lt; arr.length)也没有,我宁愿尝试:

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