在javascript中从数组中删除

IT技术 javascript
2021-03-12 08:10:07

3 小时前,我在 SO 中问了一个问题,关于删除对象的一部分,所以我将这个问题链接到它:

在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 接受的错误格式作为输入数据

有什么解决办法吗?

感谢每一个人,对我糟糕的语法感到抱歉(我是英语新手)

问候,福罗吉

3个回答

以相反的顺序遍历数组,并用于.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.
您不必以相反的顺序遍历元素,因为您splice无论如何都会在调用后终止循环如果要从数组中删除多个元素,则可以,但在这种情况下不需要。
2021-04-23 08:10:07
感谢您的完整回复及其评论,无论如何,您帮助了我,您很棒,再次感谢
2021-04-25 08:10:07
@FelixKling 你是对的。但是,由于另一个问题的公认答案不起作用,我认为break;必须将其删除。
2021-05-10 08:10:07
应该if (Roomdata[i].id === X) {改为(平等与分配)吗?
2021-05-20 08:10:07
@RobW ,是的,这是因为我只想删除一项并打破循环,我可以正常遍历它:)
2021-05-21 08:10:07

你拥有的是一个Array您应该使用splice()方法从数组中删除元素,而不是通过deleteing 元素。

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

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

        Roomdata.splice(i, 1);
        break;

    }
}  
第二个参数指定必须删除多少项。.splice(i,0)不会删除任何东西即使您将其替换为.splice(i,1),您也会通过不考虑更改的索引来跳过元素。
2021-04-29 08:10:07
@RobW:oop。至于跳过元素,无论如何他都会打破删除,所以没有什么会被跳过。
2021-04-29 08:10:07

尽管删除,但仍使用拼接。

 Roomdata.splice(i, 0);

splice 属性删除空字符串元素、未定义的引用、NULL 和 FALSE。

它会解决你的问题