【问题标题】:Can an array in javascript ever be deleted?javascript中的数组可以被删除吗?
【发布时间】:2013-09-25 12:29:02
【问题描述】:

我正在经历创建一堆数组的过程,使用 push() 添加元素并根据用于在 ui 上获取元素的过程返回一些带有一堆元素的数组。

所以我最终得到了这样的结果。

[Object, Object, Object]
0: Object
  parcels: Array[1]
  ref: "IDE25.8.2013.0637548291"
  region: "remote"
  service: "Early Delivery"
  totalPrice: 210
  weight: "1"

1: Object
  parcels: Array[1]
  ref: "IDE25.8.2013.1507892643"
  region: "remote"
  service: "Saturday"
  totalPrice: 135.67
  weight: "1"

2: Object
  parcels: Array[1]
  ref: "IDE25.8.2013.1507432643"
  region: "remote"
  service: "Saturday"
  totalPrice: 115.67
  weight: "1"

根据我所学到的,为了“删除”您需要添加删除的对象之一

所以我用

delete consignmentsArr[1];

现在我假设删除会删除数组,但事实并非如此。剩下一个是所谓的稀疏数组。所以数组不存在,不能使用,因为它的元素和对象没有定义,但它仍然存在于数组组的索引中作为一个

[Object, undefined × 1, Object]

然而,这破坏了使用 ui 元素创建的逻辑,这些元素显示其他数组中的元素。

我并不是真的想找出如何在我的应用程序中解决这个问题。 我想知道为什么这是javascript中的默认行为?为什么删除不仅仅是顾名思义的删除,然后根据仍然存在的对象重新排序索引?为什么将其保留为稀疏数组在开发过程中会有任何好处?还有...为什么不重命名为

sparse consignmentsArr[1];

【问题讨论】:

  • 重新排序索引可能非常耗时。可能这就是默认情况下不这样做的原因
  • 您可以使用拼接来删除项目,如下所示:stackoverflow.com/a/5767357/887149
  • 这是否意味着“删除”语法是遗留的?

标签: javascript arrays javascript-objects


【解决方案1】:

以下是对 Javascript delete 运算符(用于数组)的可能解释:

对于 Javascript 数组,delete 操作是O(1),因为它只是将随机访问数组的值变异undefined

像这样重组数组索引的操作(在伪javascript中):

a = [1,2,3] -> delete a[1] -> 现在是 [1,3]

应该是O(N),因为在最坏的情况下,您会删除第一个元素,并且必须移动数组的其余部分。

查看http://en.wikipedia.org/wiki/Array_data_structure 并阅读标题下的部分效率

补充: 对数组上delete 运算符行为的另一种解释是,数组上的delete 运算符与其他对象上的delete 运算符的作用相同。

如果我有一个给定的对象:a = {'hi': 'hello', 'bye': 'good bye'} 和我delete a['hi'] 然后a['hi'] 变成undefined

如果我有一个数组arry = [1,2,3],那么delete arry[1] 然后arry[1] 也变成undefined

【讨论】:

    【解决方案2】:

    我认为您的意思是使用splice 方法。

    consignmentsArr.splice(1, 1);
    

    Delete 用于从对象中删除属性。

    【讨论】:

    • 好吧,我确实是从拼接方法开始的。但是据我所知,拼接会删除数组的元素而不是数组本身。 developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/…。当我使用拼接时,即使在 (1,1) 时,它也会删除超过 1 个数组。但这并不是我在这里真正要问的。
    • 如果你想删除它自己的数组,你必须确保它是一个对象的属性,所以var a = []; delete a;不起作用,你必须做this.a = []; delete this.a'this可以是其他对象,甚至是窗口)。
    【解决方案3】:

    我认为,delete 运算符并不意味着删除数组中的项目,它只是意味着从您给定的索引中取消链接对象。

    想想consignmentsArr是一个容器,里面有三个盒子。
    每个盒子里都有一个苹果。
    delete consignmentsArr[1] 表示从第二个盒子里拿走苹果。
    你认为之前的第三个盒子,现在是第二个盒子吗? ^_^

    【讨论】:

    • 这对开发目的有何帮助?您使用框来描述此场景很可爱,但是这些框的表示链接到 ui 元素,这些元素是根据用户输入的操作定义的。我想删除盒子而不是苹果。应该有三个盒子,每个盒子都有苹果。
    • 这是一个很好的观点,删除是取消链接一个对象。这意味着垃圾收集器将知道它没有更多的现有引用,现在可以安全地删除它。
    【解决方案4】:

    删除操作符从对象中删除一个属性。

    您可以使用以下任一方式

    delete object.property
    delete object['property']
    

    delete 不是数组上的运算符。这就是为什么重新排序索引不适用于delete 的上下文。

    您仍然可以使用 splice 从数组中完全删除一个项目并重新排序索引。

    arr.splice(1, 1);
    

    【讨论】:

    • 这是我感到困惑的地方,因为拼接也可以用于数组中对象的元素
    • @gerdi:“拼接也可以用于数组中对象的元素”——我不明白。
    • 根据 mozilla developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… 的本文档,splice 的目标是数组的元素,而不是数组对象本身
    • @gerdi:Splice 删除项目并重新排序数组本身的索引。你还需要别的吗?
    • 好吧,我不想删除项目..我想删除一个数组
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 2020-12-29
    • 2013-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多