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

Unable to delete an element in array using splice

本文关键字:数组 元素 删除 拼接      更新时间:2023-09-26

我正在迭代一个数组,并且基于条件,我希望基于索引(当前使用)从该数组中删除特定元素。以下是我的代码,它正按照预期完美地工作。

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

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

在寻找更好的方法时,我发现

Delete不会从数组中删除元素,它只会设置元素定义为未定义。

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

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

演示:Fiddle

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

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

$.each显然没有处理数组的修改,我不确定(i<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);
    }
}