【问题标题】:Delete from array in javascript在javascript中从数组中删除
【发布时间】:2012-03-10 20:51:49
【问题描述】:

3 小时前,我在 SO 中提出了一个关于删除对象的一部分的问题,因此我将这个问题与它联系起来:

delete a part of object in 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 接受为输入数据的错误格式

有什么解决办法吗?

感谢大家,并对我的语法错误感到抱歉(我是英语新手)

问候,福罗伊

【问题讨论】:

  • JavaScript Array Delete Elements 的可能重复项 -- 请在提问前使用搜索。
  • 对您上一个问题的接受答案已经建议使用splice。为什么又问这个问题?
  • 对不起@Felix,但我想因为我已经问过一个关于这个问题的问题,所以我问这个问题是为了帮助读者阅读更容易理解的问题,无论如何抱歉
  • @FelixKling ,因为我使用那个回复,但它不起作用,但我用他的想法来解决我的问题,所以我接受它不是因为他的回答是正确的,因为他的回答给了我一个想法
  • @Rob:重复的答案显示了如何从数组中删除元素,这是问题所在。我认为我们不必详细介绍每个解决方案。另请参阅我对您的回答的评论。

标签: javascript


【解决方案1】:

你拥有的是一个数组。您应该使用 splice() method 从数组中删除元素,而不是通过 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),您也会因为不考虑更改的索引而跳过元素。
  • @RobW:哎呀。至于跳过元素,他无论如何都会在移除时中断,所以什么都不会被跳过。
【解决方案2】:

以相反的顺序遍历数组,并使用.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.

【讨论】:

  • 感谢您的完整回复及其cmets,无论如何您帮助我,您很棒,再次感谢
  • 在调用splice 之后终止循环,您不必以相反的顺序遍历元素。如果你想从一个数组中删除多个元素,那么可以,但在这种情况下不需要。
  • @FelixKling 你是对的。但是,由于在另一个问题上接受的答案不起作用,我认为必须删除 break;
  • @RobW ,是的,这是因为我只想删除一个项目并打破循环,我可以正常遍历它:)
  • 应该改为if (Roomdata[i].id === X) {(平等与分配)?
【解决方案3】:

尽管删除也使用拼接。

 Roomdata.splice(i, 0);

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

它会解决你的问题

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 2012-05-03
    • 1970-01-01
    • 2015-01-28
    相关资源
    最近更新 更多