JavaScript中的从数组中删除元素

13

3小时前,我在stackoverflow上提了一个问题,关于如何删除对象的一部分,所以我将这个问题链接到了下面的地址:

Javascript中如何删除对象的一部分

但是当我从数组中删除时,出现了另一个问题。我使用该对象来填充FlexiGrid。但是,当我通过以下代码从该对象中删除一个项目时,它不是真正被删除,而是设置为undefined :( 并且flexigrid不接受它作为输入数据。

for (var i = 0; i < Roomdata.length; i++) {

    if(Roomdata[i].id = X) {

        delete Roomdata[i];
        break;

    }
}                
例如,假设我有像这样的Roomdata中的3个项目:
{item1, item2, item3}

当我调用下面的代码删除item2时,Roomdata对象看起来是这样的:

{item1, undefined, item3}

这是一种不被Flexigrid接受的错误格式的数据输入方式。

有没有解决方案呢?

感谢大家,对于我的糟糕语法表示抱歉(我英语还很新)。

问候,Foroughi


可能是JavaScript数组删除元素的重复问题 - 请在提问前使用搜索功能。 - Felix Kling
你之前的问题已经有一个被接受的答案,建议使用 splice。为什么你还要再问一遍这个问题呢? - Felix Kling
抱歉@Felix,但我认为因为我已经问过这个问题了,所以我问这个问题是为了帮助读者更好地理解问题,无论如何对此感到抱歉。 - Ali Foroughi
@FelixKling,因为我使用了他的回复,但它并没有起作用,但是我使用了他的想法来解决我的问题,所以我接受了它,不是因为他的答案是正确的,而是因为他的答案给了我灵感。 - Ali Foroughi
@Rob:重复的答案展示了如何从数组中删除一个元素,这就是问题所在。我认为我们不必详细地给出每个解决方案。请参见我的回答评论。 - Felix Kling
4个回答

58

倒序遍历数组,并使用.splice来移除元素。
你必须倒序遍历,否则你会跳过一些元素参见下文

for (var i = Roomdata.length-1; i >= 0; i--) {
    if (Roomdata[i].id == X) {
        Roomdata.splice(i, 1);
        break;
    }
}

如果不按相反的顺序行走会发生什么:

// This happens in a for(;;) loop:
// Variable init:
var array = [1, 2, 3];
var i = 0;

array.splice(i, 1); // array = [2, 3]   array.length = 2
// i < 2, so continue
i++;  // i = 1    

array.splice(i, 1); // i=1, so removes item at place 1: array = [2]
// i < 1 is false, so stop.

// array = [2]. You have skipped one element.

1
感谢您的完整回复和评论,无论如何您都帮助了我,您真是太棒了,再次感谢。 - Ali Foroughi
2
您不必按相反顺序遍历元素,因为在调用splice后会终止循环。如果您想从数组中删除多个元素,则需要,但在这种情况下不需要。 - Felix Kling
@FelixKling 你是对的。然而,由于另一个问题中被接受的答案没有起作用,我认为必须删除 break; - Rob W
@AliForoughi 只是提供信息,被接受的答案不起作用,因为i < j总是为真,或者总是为假。应该使用i--而不是j-- - Rob W
2
应该是 if (Roomdata[i].id === X) { 而不是赋值操作符(等于号)吗? - Eric Smith
显示剩余3条评论

4
你有的是一个数组。应该使用splice()方法来从一个数组中删除元素,而不是通过delete删除该元素。
for (var i = 0; i < Roomdata.length; i++) {

    if(Roomdata[i].id = X) {

        Roomdata.splice(i, 1);
        break;

    }
}  

2
第二个参数指定需要移除多少项。 .splice(i,0) 不会删除任何东西。即使您将其替换为 .splice(i,1),由于没有计算索引的更改,您仍会跳过元素。 - Rob W
@RobW:哎呀。至于跳过元素,他在删除时已经中断了,所以不会有任何东西被跳过。 - Matt

3

使用 splice 而不是 delete。

 Roomdata.splice(i, 0);

splice属性可以移除空字符串元素、未定义的引用、NULL和FALSE,这将解决您的问题。

它将帮助您解决问题。


1
为了删除数组中所有与特定值匹配的元素,可以执行以下操作:
// Remove all elements in arr[] matching val
for (let i = 0;  i < arr.length;  i++) {
    if (arr[i] === val) {
        arr.splice(i--, 1);   // Remove arr[i] and adjust the loop index
    }
}

请注意这是数组的正向扫描。循环索引的递减是必要的,以便循环在删除元素后不会跳过下一个元素。


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