我正在经历创建一堆数组的过程,使用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];
答案 0 :(得分:1)
答案 1 :(得分:1)
以下是Javascript delete
运算符的可能解释(在数组中使用):
对于Javascript数组,delete
操作为O(1)
,因为它只是将随机访问数组的值变为 undefined
。
将重新组织数组索引的操作(在伪javascript中):
a = [1,2,3]
- > delete a[1]
- > a现在是[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 :(得分:1)
我认为,delete
运算符并不意味着删除数组中的项,它只是意味着将对象与您给出的索引取消链接。
考虑consignmentsArr
是一个容器,其中有三个框
每盒都有一个苹果
delete consignmentsArr[1]
表示将苹果从第二个盒子中取出
你认为之前的第三个盒子,现在是第二个盒子吗? ^ _ ^
答案 3 :(得分:0)
删除操作符从对象中删除属性。
您可以使用以下任意一种
delete object.property
delete object['property']
delete
不是数组上的运算符。这就是为什么重新排序索引不适用于delete
。
您仍然可以使用splice从数组中完全删除项目并重新排序索引。
arr.splice(1, 1);