删除索引后的所有项目

Sta*_*ers 48 javascript jquery

我有一个数组:

array = ['mario','luigi','kong']
Run Code Online (Sandbox Code Playgroud)

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

array.splice(1) //-> ['luigi','kong']
Run Code Online (Sandbox Code Playgroud)

我只是想知道是否有一个类似于splice的函数来删除索引后的所有项:

伪代码

array.mirrorsplice(1) //-> ['mario','luigi']
Run Code Online (Sandbox Code Playgroud)

dan*_*vis 108

使用Array.length设置新的大小的阵列,这是比剪接()突变速度快:

var array = ['mario','luigi','kong', 1, 3, 6, 8];
array.length=2;
alert(array); // shows "mario,luigi";
Run Code Online (Sandbox Code Playgroud)

为什么它更快?因为Array.splice必须创建一个包含所有已删除项目的新数组,而不.splice创建任何内容并"返回"数字而不是新数组.

为了解决.length使用问题,您可以为它提供一个负数索引,以及一个巨大的数字来切断数组的结尾:

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

  • 减少`length`会导致内存泄漏还是javascript引擎会处理这个?---好的,根据ECMAScript规范,这是明确定义和正确处理的,元素将被删除.http://stackoverflow.com/questions/31547315/is-it-an-antipattern-to-set-an-array-length-in-javascript/31560542#31560542 (5认同)
  • 专业提示您可以使用“array.splice(0, Infinity)”。我的意思是,我很难相信你可以拥有一个包含超过 9000000000 个项目的数组...但是当你有理由在 JS 中使用 Infinity 关键字时,你确实会感觉很酷:) (5认同)

sha*_*a-1 10

虽然为数组长度分配一个较短的值(如@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"]
Run Code Online (Sandbox Code Playgroud)

如您所见,您需要存储slice方法返回的值.要理解'为什么',这里是slicesplice方法之间的主要区别:

  • splice()方法返回数组中已删除的项,并且slice()方法返回数组中的选定元素,作为新的数组对象.
  • splice()方法更改原始数组并且slice()方法不会更改原始数组.

  • 这是一个小基准(https://jsperf.com/remove-all-array-elements-after-a-given-index),比较为此问题提供的解决方案. (3认同)

Niñ*_*ura 7

删除所有项目的索引后

var array = ['mario','luigi','kong'],
index = 1; // your index here
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
Run Code Online (Sandbox Code Playgroud)

结果:

['mario', 'luigi']
Run Code Online (Sandbox Code Playgroud)

您需要 +1,因为splice开始在索引处删除。


noo*_*oob 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']
Run Code Online (Sandbox Code Playgroud)

有关更多信息:请参阅MDN 文档