如何使用安全方法删除Javascript数组的元素?

如何使用安全方法删除Javascript数组的元素?,javascript,arrays,Javascript,Arrays,我有一个密码: myarray[150] = 'a'; myarray[80] = 'b'; myarray[122] = 'c'; 然后: myarray.splice(80, 1); myarray[80] = 'b'; 以上代码在我的申请中的结果是: [150]=“a”;[80]=“b”;[121]=“c” 我不明白为什么c值有121作为索引。有人能解释我的代码出了什么问题吗?因为当你在索引122上启动c,然后从数组中删除一个元素时,它的长度改变了,最新的索引现在是121而不是122这

我有一个密码:

myarray[150] = 'a';
myarray[80] = 'b';
myarray[122] = 'c';
然后:

myarray.splice(80, 1);
myarray[80] = 'b';
以上代码在我的申请中的结果是:

[150]=“a”;[80]=“b”;[121]=“c”


我不明白为什么
c
值有
121
作为索引。有人能解释我的代码出了什么问题吗?

因为当你在索引122上启动c,然后从数组中删除一个元素时,它的长度改变了,最新的索引现在是121而不是122

这行代码删除了索引80处数组的一个元素。因此,80之后的所有元素将下移一个索引:

myarray.splice(80, 1);
如指定的,第二个参数是要删除的图元数

因此,在做

myarray.splice(80, 1);
您仅在位置80处移除一个元件

“c”
向左移动一个索引


此外,做

myarray[80] = 'b';
不添加其他元素,但更改现有元素的值。

您必须使用:

delete myarray[80]
为了安全地删除,splice()将删除数组元素,但不会使其为空。因此,指数变化,“c”的指数为“121”


有关它的详细信息,您可以阅读

您想使用splice两次:

myarray.splice(80, 1);
myarray.splice(80, 0,"b");
或者不删除,而是覆盖为null/undefined

myarray[80]=undefined;
然而,这个数组将由117个“未定义”组成,正如adam所说的,它是一个反模式。可以这样做:

var myarray={};
myarray[80]="b";
delete myarray[80];

它只有一个元素,因此不消耗内存。

此外,此代码myArray[80]=“b”在splice之后不会向表中添加新元素,只需更改现有元素。不要使用稀疏数组,总有比稀疏数组更好的数据结构。使用对象(例如字典)或对象数组。@adam:你能举个例子吗?
myarray={150:'a',80:'b',122:'c'}
在这种情况下,只需执行
删除myarray[80]
(或
myarray[80]=null
)。另一种数据结构是对象数组:
myarray=[];myarray.push({id:150,值:'a'})、myarray.push({id:80,值:'b'})、myarray.push({id:122,值:'c'})
@Michael不太正确。两者都使用delete,但Adams的要点是不要使用数组,而是使用对象,mike并没有建议回到我最初的评论-不要使用稀疏数组。此代码运行良好@Adam你觉得他的解决方案怎么样?@Michael这完全解决了你的问题,但当有更好的数据结构解决你的问题时,稀疏数组是一种反模式。我对此投了反对票,不是因为它不正确,而是因为它促进了一种不好的做法。请注意,稀疏数组会自动分配给包含具有最高索引的指定元素的长度(本例中为150)。这意味着,只要您以任何顺序加载带有更多元素的
myarray
myarray.length
就会跟踪具有最高分配索引的元素。但是,如果您碰巧删除了该元素,
myarray.length
将保持不变,如果您需要在删除元素后保留跟踪行为,则必须手动调整该元素。关于该主题的有趣见解:这是您将在应用程序中使用的方法吗?或者这仅仅是解决OP问题的方法,正如他们所说的那样?海报试图解决的问题和他们要求的解决方案很少是一样的。@Adam,你想建议我复制并粘贴你上面的评论,强化你的想法吗?不,如果你只是删除这个作为答案可能会更好,因为,虽然它不是错误的,但质量很低。@Adam,就像上面所有的答案一样,这实际上不是在回答问题,而是在确定问题。你是对的,我应该通过投票,否决所有的问题,而不仅仅是我否决的第一个问题。