从数组中删除元素的最佳方法,而不重新排列它。

6

我需要删除数组中的一些元素,但是不想重新排列数组。

如果我使用 "delete" 删除我的元素,这些 "空洞" 会占用内存吗?

var array=["A","B","C"];
delete array[1];  // array -> ["A", undefined, "C"]

我认为被删除的元素真的被删除了,所以它不会占用内存空间,这不是真的吗?

4个回答

10

不要重新排列它,因此splice不是我要找的。 - blow
3
使用splice方法不会重新排列数组,而是完全删除索引。您的意思是,您不想从数组中删除该索引吗?如果是这样,只需将该索引处的值设置为null。 - JoshNaro

4

完全取决于实现。在内部,所有JS表示最终都将转换为稀疏表示,但稀疏表示倾向于使用更多的内存和比非稀疏数组访问速度更慢。

因此,从密集数组中删除一个值不太可能释放任何内存,但在删除足够多的元素后,实现很可能会转换为稀疏表示以节省整体内存。

注意:您删除的索引处的对象或值不会立即被删除--删除只是从对象中删除属性槽--只有在GC传递期间,并且只有没有其他引用时,对象/值才会被删除。


2

您可以使用array.splice(1, 1);。它将删除索引为1的一个条目。第一个参数是索引,第二个参数是计数。


1
不需要重新排列,因此“splice”不是我要找的。 - blow

0

有很多方法可以做到这一点。其中之一是创建不包括索引的数组切片,然后将这些切片连接起来。

var arr = ["A", "B", "C"];
const idx = 1;

//Before
console.log(arr);

arr = arr.slice(0, idx).concat(arr.slice(idx + 1));

//After
console.log(arr);


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