删除一个数组元素

3

如果BOOK_COPY_IDid都等于0,那么整个数组就会变为空。如果我加上return语句,也会被删除。

这是我的代码:

var i = 0;
    while(i < bookLoop.length)
    {
        if(parseInt(bookLoop[i].BOOK_COPY_ID) == parseInt(id))
        {
           bookLoop.splice(i);           
        }
        i++;
    }

2
执行splice(i, 1)时,你还需要指定要拼接多少个元素,否则它将一直拼接到数组末尾。 - Cornel Raiu
请更详细地解释您的目标。 - luukvhoudt
1
更好的方法是使用Array.prototype.filter() - lurker
3个回答

2

您缺少 deleteCount 参数,用于 splice。如果没有该参数,它将删除索引后面的所有元素:

bookLoop.splice(i, 1);

当你使用splice时,也不应该增加i,因为你已经删除了该索引:

var i = 0;
while(i < bookLoop.length)
{
    if(parseInt(bookLoop[i].BOOK_COPY_ID) == parseInt(id))
    {
        bookLoop.splice(i);           
    }
    else {
        i++;
    }
}

1

你忘记添加第二个参数(deleteCount)了

如果省略 deleteCount 参数,或者它的值等于或大于 array.length - start(也就是说,如果它等于或大于从 start 开始剩余的元素数量),则将删除从 start 到数组结尾的所有元素。

了解更多关于 array.splice 的信息

var id = "123";

var bookLoop = [
  { BOOK_COPY_ID: "123" },
  { BOOK_COPY_ID: "456" },
  { BOOK_COPY_ID: "789" }
];

var i = 0;

while (i < bookLoop.length) {
  if (parseInt(bookLoop[i].BOOK_COPY_ID) == parseInt(id)) {
    bookLoop.splice(i, 1);
  } else { i++; }
}
console.log(bookLoop);


1
根据文档:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/splice

如果您不指定第二个参数deleteCount,它将删除当前位置到数组末尾的所有项。因此,您的代码应该类似于这样:
var i = 0;
while(i < bookLoop.length)
{
    if(parseInt(bookLoop[i].BOOK_COPY_ID) == parseInt(id))
    {
       bookLoop.splice(i, 1);           
    } else {

        i++;
    }
}

另一种不错的方法是在这篇文章中提到的其中一种:https://love2dev.com/blog/javascript-remove-from-array/
var newArray = bookLoop.filter(function(value){

    return parseInt(value.BOOK_COPY_ID) == parseInt(id);

});

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接