删除索引后的所有项目

106

我有一个数组:

array = ['mario','luigi','kong']

我调用它的splice函数,以删除索引之前的所有项

array.splice(1) //-> ['luigi','kong']

我在想是否有一个类似于splice的函数,可以删除指定索引后面的所有项

伪代码

array.mirrorsplice(1) //-> ['mario','luigi']

6个回答

203

使用Array.length来设置数组的新大小,这比使用Array.splice更快速地进行变异:

var array = ['mario','luigi','kong', 1, 3, 6, 8];
array.length=2;
alert(array); // shows "mario,luigi";
为什么更快?因为 .splice 必须创建一个包含所有移除项的新数组,而 .length 不会创建任何东西,而是“返回”一个数字而不是一个新数组。

为了处理.splice的用法,可以向其提供一个负索引以及一个巨大的数字来截断数组的末尾:

var array = ['mario','luigi','kong'];
array.splice(-1, 9e9); 
alert(array); // shows "mario,luigi";

13
减小数组的 length 属性会导致内存泄漏吗?还是 JavaScript 引擎会处理好这一点?--- 根据 ECMAScript 规范,这已经被明确定义并正确处理,元素将被删除。参考链接:https://dev59.com/a1wZ5IYBdhLWcg3wWvRY#31560542 - Daniel F
5
专业提示:你可以使用array.splice(0, Infinity)。我的意思是,我难以相信你会有一个包含超过9000000000个元素的数组...但当你有理由在JS中使用Infinity关键字时,你会感觉很酷 :) - James Harrington
数组长度技巧适用于获取样本数组中的6, 8吗?因为我不知道如何使用长度技巧获取数组中的最后元素。这只能用splice实现,对吗? - Hangfish
@Hangfish:如果你只想获取元素而不改变数组,请使用.slice(-2)。如果你需要收集你删除的元素,请使用.splice() - dandavis
1
如果您使用此方法将数组裁剪到最大长度,并且不确定您的数组是否比最大长度更长,您可能会首先进行检查: const maxLen = 3; if (array.length > maxLen) array.length = maxLen; 否则,您将在已经足够短的数组中添加空值。 - mattsoave
显示剩余2条评论

21
尽管像@dandavis所说,将较短的值分配给数组长度是从数组中删除尾随元素的最快、最简单的方法,但您也可以使用类似于splice的方法,称为slice来完成这个操作。如下所示:

array = ['mario', 'luigi', 'kong'];

array = array.slice(0, 2); //Need to assign it to the same or another variable

console.log(array); //["mario", "luigi"]

如您所见,您需要存储从 slice 方法返回的值。为了理解“为什么”,以下是slicesplice方法之间的主要区别:

  • splice() 方法返回数组中已删除的项目,而 slice() 方法作为新数组对象返回所选元素。
  • splice() 方法更改原始数组,而 slice() 方法不更改原始数组。

3
这里有一个小基准测试(https://jsperf.com/remove-all-array-elements-after-a-given-index),用于比较针对此问题提供的解决方案。 - Stephan
Benchmark链接目前已经失效 @Stephan - Parris Varney

10

要在索引之后删除所有项:

var array = ['mario','luigi','kong'],
index = 1; // your index here
array = array.splice(index + 1, array.length - (index + 1) );
// 3 - (1+1) = 1
// 1 is the remaining number of element(s) in array
// hence, splice 1 after index

结果:

['mario', 'luigi']

由于splice从索引开始删除,因此您需要+1。


5

我认为你误解了Array.prototype.splice()的用法。它已经实现了你要求的功能(删除索引后的所有内容,读下面的段落以获取更正信息),并且它确实会返回删除的值。我认为你把返回值与数组当前的值混淆了。

Array.prototype.splice()会同时移除提供的索引值,这基本上相当于设置数组的长度。因此,如果你将其作为array.splice(2)调用,则会将长度设置为2,并删除包括索引2及其后面的所有内容。前提是数组的当前长度大于提供给Array.prototype.splice()方法的第一个参数。

例如:

const array = ['mario','luigi','kong'];
const deletedItem = array.splice(1);
console.log(array); // ['mario']
console.log(deletedItem); // ['luigi','kong']

更多信息请参见MDN文档


然而,我仍然更喜欢修改数组长度,因为splice有时可能会让人感到困惑。 - 0xC0DED00D

3
你可以使用splice。这里有一个演示。
var array = ['mario','luigi','kong']

要删除索引之后的所有元素:

var removedElement = array.splice(index, array.length)

removedElement数组将包含从array中移除的元素列表。

示例:

let index = 2;
var removedElement = array.splice(2, array.length); 
removedElement = ["kong"];
array = ["mario", "luigi"];

不知道为什么会被踩,但这个函数在我的一些实际项目中被使用,并且对于任何动态长度都能正常工作。但是我总是欢迎改进。 - Yagnesh Khamar
应该是我认为的正确答案 - Gabe M

1
你可以使用 .slice 来完成这个操作。
例如(从数组中删除除前1000个条目以外的所有内容): originalArray = originalArray.slice(0, 1000)

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