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

4

I have a code :

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

然后:
myarray.splice(80, 1);
myarray[80] = 'b';

我的应用程序上述代码的结果是:

[150] = 'a'; [80] = 'b'; [121] = 'c';

我不明白为什么值为c的项具有索引121。有人可以解释一下我的代码哪里出了问题吗?

3
不要使用稀疏数组,总有比稀疏数组更好的数据结构。可以使用对象(例如字典)或对象数组。 - Adam Jenkins
1
myarray = {150:'a',80:'b',122:'c'} In this case, simply do delete myarray[80] (or myarray[80] = null). An alternative data structure is an array of objects: myarray = []; myarray.push({id:150,value:'a'}),myarray.push({id:80,value:'b'}),myarray.push({id:122,value:'c'}) - Adam Jenkins
2
@Michael 不太对。两者都使用了 delete,但是 Adams 的观点是不要使用数组而是对象,而 Mike 并没有建议这样做。 - Jonas Wilms
2
回到我的原始评论 - 不要使用稀疏数组。 - Adam Jenkins
它们都是“安全的”,但亚当建议的设计更明智。 - Jonas Wilms
显示剩余4条评论
6个回答

6
这行代码会删除数组中索引为80的一个元素,因此,80之后的所有元素都会向下移动一个索引:
myarray.splice(80, 1);

4

您需要使用:

delete myarray[80]

安全删除


这段代码运行良好。@Adam,你认为他的解决方案怎么样? - Mr. Mike
2
@Michael,这个解决方案确实可以解决你所述的问题,但是当有更好的数据结构可以解决你的问题时,稀疏数组就成为了一种反模式。我会给它点踩,不是因为它是错误的,而是因为它在推广一种不好的做法。 - Adam Jenkins
请注意,稀疏数组会自动分配到包含最高索引(在本例中为150)的长度。这意味着只要您以任何顺序加载myarray的更多元素,myarray.length就会为您跟踪具有最高分配索引的元素。但是,如果您删除该元素,则myarray.length保持不变,如果需要在元素删除后保留该跟踪行为,则必须手动调整它。 - jfroy
有关该主题的有趣见解:https://remysharp.com/2018/06/26/an-adventure-in-sparse-arrays - jfroy

1

你想要使用splice两次:

myarray.splice(80, 1);
myarray.splice(80, 0,"b");

或者你不删除,而是将其覆盖为null/undefined。
myarray[80]=undefined;

然而,这个数组将包含117个"undefined",正如Adam所说的那样,这是一种反模式。可以这样做:
var myarray={};
myarray[80]="b";
delete myarray[80];

它只有一个元素,因此不会占用太多内存。

2
这是您在应用程序中使用的方法吗?还是仅仅可以解决原帖作者所述的问题?求助者尝试解决的问题和他们请求的解决方案很少是相同的。 - Adam Jenkins
@Adam,所以你想建议我复制粘贴你上面的评论并窃取你的想法? - Jonas Wilms
1
不,最好你把这个回答删掉,因为虽然它并不是错误的,但质量很低。 - Adam Jenkins
@Adam,和上面所有的答案一样,实际上都没有回答问题,只是确定了问题。 - Jonas Wilms
2
你说得对,我应该浏览并且给所有的帖子都点个踩,而不仅仅是第一个我点踩的那个。 - Adam Jenkins

0

因为当您在索引122处初始化c时,然后从数组中删除一个元素,其长度发生了变化,最新的索引现在是121而不是122


此代码中,splice 后的 myArray[80] = 'b' 并没有向表中添加新元素,而只是更改了现有元素。 - Kasia

0

.splice() 方法可以移除数组中的元素,但不会使其变为空。因此,索引会发生改变,'c' 的索引变为 '121'

更多相关信息请参考这里


0
根据Array.prototype.splice()文档所示,第二个参数是要删除的元素数量。
因此,在执行操作时,
myarray.splice(80, 1);

您只是在删除一个元素,位置为80。

"c"会向左移动一个索引。


此外,进行编程

myarray[80] = 'b';

不会添加新元素,但会更改已存在元素的值。


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