为什么从Javascript数组中删除元素不会改变其长度?

12

我有一个数组:

data.Dealer.car[0]
data.Dealer.car[1]
data.Dealer.car[2]

如果我这样做:

alert(data.Dealer.car.length);
delete data.Dealer.car[1];
alert(data.Dealer.car.length);
每次输出的计数值都相同。已经删除的元素是否仍然存在?

可能是JavaScript数组删除元素的重复问题。 - user177800
@JarrodRoberson — 这似乎不是完全重复的。您提供的链接问题是在询问deleteArray.prototype.splice之间的区别,而这个问题基本上是在问为什么从数组中删除一个元素(从而使其变成稀疏数组)不会减少它的长度。 - chharvey
我已经编辑了问题,使其更清晰。 - chharvey
6个回答

20

如果你想要移除一个元素,可以使用splice方法:

alert(data.Dealer.car.length);
data.Dealer.car.splice(1, 1);
alert(data.Dealer.car.length);

但需要注意的是索引已经发生了改变。


14

JavaScript数组不是稀疏的。如果您有0和2,则元素1必须存在,这意味着length将会是3。


1
是的,元素2将是未定义的。 - Bite code
当您在数组的最后一个索引处删除某个元素时会发生什么? - Tim Frey
1
如果您删除最后一个元素,则数组的长度将保持不变。您可以设置长度来缩小数组到任何想要的大小。 - Ates Goral
2
是的,JavaScript 数组实际上可以是稀疏的。 - Ry-
JS数组可以是稀疏的。稀疏数组是指具有一个或多个未初始化元素的数组。例如,let arr = ['foo' , , 'bar']是一个稀疏数组,因此它的长度为3,即使arr[1]没有值。 - chharvey

5

Array.shift()会从数组中删除第一个项目并使其变短。 Array.pop()将删除最后一个项目。


5

基于 @Ray Hidayat 的回答:

JavaScript 数组是稀疏的。如果你有一个长度为 3 的数组,在 [1] 处删除引用只会简单地“取消设置”该项,而不会将其从数组中删除或更新该数组的长度。可以使用

myArray = [0, , 2, , , , ];  // length 6; last three items undefined

这是一个Fiddle: http://jsfiddle.net/WYKDz/ 请注意:从大数组的中间移除项目可能会导致计算量很大。有关更多信息,请参见此帖子: 从Array()中删除一个条目的最快方法

这不是“稀疏”的意思。 - Dara Java
4
"那就是sparse的意思。"(不行吗?至少说一下你对它的定义是什么……) - Ry-

2

我想你在寻找这个:

var arr = [0,1,2,3,4];

alert( arr.splice( 2, 1 ) ); // alerts 2, the element you're removing
alert( arr ) // alerts 0,1,3,4  - the remaining elements

这里有一个MDC参考资料


0

好的,现在已经修复了,因为数组仍然被分配了。

我基本上需要做的是:

var newCar = new Array();
for (i = 0 ; i < tblSize -2; i ++)
{
    newCar[i]=data.Dealer.car[i];
}
data.Dealer.car = newCar;

2
你想要移除最后一个项目吗?只需要使用:data.Dealer.car.pop(); - some

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