从数组中删除最后一个项目

797

我有以下数组。

var arr = [1,0,2];

我想要移除最后一个元素2。

我使用了arr.slice(-1);,但它并没有移除该值。


54
使用 arr[.pop()] 方法。(该方法的具体说明请参考 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Array/pop) - Tushar Gupta - curioustushar
3
arr.splice(-1,1) 将返回数组 [1,0]; arr.slice(-1,1) 将返回 [2]。 - Anja Ishmukhametova
40
arr.slice(0,-1) 对我来说是最佳解决方案。 - Black Mamba
14
这个问题有点含糊,因为“删除最后一个元素”可能意味着从数组中移除该元素并保留该数组(只是元素减少了一个)。但它也可能意味着删除该元素并保留该元素。对于第一种情况,可以使用 splice() 方法;对于第二种情况,可以使用 pop() 方法。 - thoni56
1
@Anja Ishmukhametova在2015年的评论中提到的代码格式化:"arr.splice(-1,1)会返回数组[1,0]arr.slice(-1,1)会返回[2]" - Cadoiz
显示剩余2条评论
29个回答

982

12
Array.prototype.pop() 看起来是最快的。http://jsperf.com/slice-vs-splice-vs-pop/3 - Daniel
1
使用pop()时,请确保不要执行jQuery('#foo').val(numbers.pop()),除非您只想将数组的最后一个项目放入字段中。pop()返回已删除的元素。就像Stuart所做的那样,首先执行numbers.pop(),然后执行jQuery('#foo').val(numbers)... - Charles Robertson
7
希望增加一个unpop()函数,可以返回数组中剩余的元素,这会很酷。 - eomeroff
6
有没有方法在保持数组不可变的情况下完成这个操作? - nayiaw
9
是的,这是ES6展开语法:let fruit = ['apple', 'orange', 'banana', 'tomato']; let popped = [...fruit].pop();然后 popped 等于 tomato,而 fruit 仍然等于 ['apple', 'orange', 'banana', 'tomato'] - Stuart Kershaw
显示剩余2条评论

740
使用 splice(startPosition, deleteCount) 方法。
array.splice(-1)

var array = ['abc','def','ghi','123'];
var removed = array.splice(-1);  //last item
console.log( 'array:', array );
console.log( 'removed:', removed );


1
@PrithvirajMitra 你想要移除1和0吗?所以数组== [2]? - Anton
1
然后你可以这样做 arr.splice(0,2) @PrithvirajMitra - Anton
8
对于只有一个元素的数组不起作用:[1].splice(-1, 1) => [1] - Tvaroh
6
仅使用pop命令将返回最后一个元素的值。如果我理解正确,@PrithvirajMitra想要做两件事:1)从原始数组中删除最后一个元素,2)将该元素作为单个元素数组返回 - 即:[0,1,2] -> [2],留下 [0,1]。如果是这种情况,那么[arr.pop()]就可以完成任务。 - Ben Hull
47
请注意,array.pop() 会修改 array,而 slice(0, -1) 则不会。pop() 虽然更快,但并不总是适用于所有需求。 - adelriosantiago
显示剩余13条评论

451

你可以使用.slice()方法来实现:

arr.slice(0, -1);    // returns [1,0]

这是一个演示:

var arr = [1, 0, 2];
var newArr = arr.slice(0, -1);    // returns [1,0]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(0, -1): </b>
<div id="div2"></div>

不是做:

arr.slice(-1);   // returns [2]

这里是一个演示:

var arr = [1, 0, 2];
var newArr = arr.slice(-1);    // returns [2]

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
<script src="http://code.jquery.com/jquery.min.js"></script>
<b>Original Array    : </b>
<div id="div1"></div>
<br/>
<b>After slice(-1): </b>
<div id="div2"></div>

说明:

Array.prototype.slice() 或简写为 slice() 方法的基本语法如下:

arr.slice([begin[, end]])

在这里,

begin 参数是一个从零开始的索引,表示从数组中开始提取的位置。所以,假设我们根据上面的示例进行以下操作:

arr.slice(0)    // returns [1,0,2]

它将从序列的起始位置0返回所有的数组元素,即[1,0,2]。同样地,如果我们执行

arr.slice(1)    // returns [0,2]

如果传入的起始参数为正值,如例子中的0,那么该方法将返回从该位置(包括该位置)开始的所有元素,因此在这个例子中会返回[0, 2]。但是,在您的情况下,传入了一个负数索引,即-1作为起始参数,它表示从序列末尾的偏移量。因此,在您的情况下,slice(-1)提取了序列中的最后一个数组元素,即2(正如我们在上面的示例中已经看到的)。

现在,让我们来谈谈slice()方法语法中的end参数。它同样也是一个基于零的索引,表示从数组中提取的结束位置。所以,假设我们有一个数组:


(Tips: "Let's say"可以翻译成"假设")
var arr = [1, 0, 2, 5, 3, 9];

我们想要获取数组中的2,5,3元素。现在,从序列开头开始,2的位置是2,最后一个元素3的位置是4。我们需要在位置5结束提取,因为我们需要获取该位置之前的元素。所以,我们将在此处简单实现slice()方法,如下:

arr.slice(2, 5)    // returns [2,5,3]

根据您的情况,我们已将-1实现为结束参数,因此我们的代码如下:

arr.slice(0, -1)   // returns [1,0]

作为一个负数索引,end表示从序列末尾的偏移量。因此,slice(0,-1)提取序列中第一个元素到倒数第二个元素。这样,我们就得到了期望的输出。我们也可以像下面这样操作:

arr.slice(0, 2)    // returns [1,0]

我们将获得相同的输出。但是,我在这里使用了-1,因为即使对于像此类长数组也更容易实现。

[0,2,3,1,2,9,3,6,3,9,1,0,2,9,0,1,1,2,3,4,7,9,1]

如果您只想删除最后一个元素,而不想坐在那里计算最后一个9的位置,然后像arr.slice(0,22)一样进行操作。那么您可以简单地在这里实现负索引逻辑,然后执行。
arr.slice(0, -1) // same result as arr.slice(0, 22)

17
这很好用,只需注意这是对.slice()的调用而不是.splice()。 - Brian Hasden
8
需要注意的是,这个解决方案并不会删除数组arr中的最后一个项目,而是返回一个新的数组,该数组不包括最后一个项目。正如Mozilla文档所说:“slice()方法将数组的一部分浅复制到一个新的数组对象中。”。 - F Lekschas
6
这段样例代码隐含地询问如何从原始数组中删除最后一个值并获得一个新的数组。因此,arr.slice(0, -1) 是最佳答案。 - Tsounabe
6
“slice更好因为它不会修改原始数组。” - user365314

181

通过例子来学习:

let array_1 = [1,2,3,4];
let array_2 = [1,2,3,4];
let array_3 = [1,2,3,4];
let array_4 = [1,2,3,4];

array_1.splice(-1,1)  // returned --> [4]      array_1 = [1,2,3]
array_2.slice(0,-1);  // returned --> [1,2,3]  array_2 = [1,2,3,4]
array_3.pop();        // returned --> 4        array_3 = [1,2,3]
array_4.shift();      // returned --> 1        array_4 = [2,3,4]

35
这应该是被接受的答案,因为它说明了大多数人所犯的错误。> 返回所需的数组 以所需的方式改变数组。 - Penguin9
1
@RaisingAgent 感谢您注意到这些事情 :) - Lukas Liesis
3
最完整的答案。谢谢伙计! - Donald Shahini
如果您使用.splice(-1,1),则可以省略,1,因为splice(-x)会从第-x个元素开始删除所有元素,其中第x个元素是从后面数的第x个。对于-x使用-1,从"最后一个"开始删除所有元素与从"最后一个"开始删除所有元素完全相同。 - Cadoiz
1
@Cadoiz,使用语言的默认设置是很酷的,当你了解这种行为时。然而,许多开发人员可能不具备这种知识,我认为定义它并不跳过它更易读且更防止错误。 - Lukas Liesis

106

由于slice不会改变原始数组,因此您需要这样做。

arr = arr.slice(0, -1);

如果您想更改原始数组,可以使用splice

arr.splice(-1, 1);

或者pop

arr.pop();

4
使用arr = arr.slice(0, -1);替代arr = arr.slice(-1); - Swaleh Matongwa
如果您使用.splice(-1,1),则可以省略,1,因为splice(-x)会从第-x个元素开始删除所有元素,这是从后面数的第x个元素。对于-x的值为-1,从"最后一个"开始删除所有元素与从"最后一个"开始删除所有元素完全相同。 - Cadoiz

31

我认为.pop()是最“正确”的解决方案,但有时它可能行不通,因为你需要在那里使用没有最后一个元素的数组...

在这种情况下,您可能想要使用以下方法,它将返回[1,2,3]

var arr = [1,2,3,4];
console.log(arr.splice(0,arr.length-1));

当使用.pop()时,它将返回4

var arr = [1,2,3,4];
console.log(arr.pop());

可能并不是理想的情况...

希望这可以为您节省一些时间。


1
谢谢,伙计。这正是我需要使用的例子。我很感激 :) - Barry Michael Doyle
2
这是最正确的答案。可惜其他人排名更高。 - mmla
你可以在 arr.splice(0,arr.length-1) 中省略 0 - Cadoiz

20

只需根据您的用例使用以下内容:

var arr = [1,2,3,4];
arr.pop() //returns 4 as the value
arr // value 4 is removed from the **arr** array variable

注意:当您执行pop()函数时,即使该行返回弹出的项,原始数组也会受到影响并且已弹出的元素被删除。


19

有一个相关的函数可以实现这个功能,这里有详细解释:

arr.pop();

14

你可以简单地使用arr.pop()

这将删除数组的最后一个条目。

var arr = [1,0,2]; 
var popped = arr.pop();//Now arr = [1,0] & popped = 2

12

arr.slice(-1)会返回数组的最后一个元素的副本,但不会改变原始数组。

要从数组中删除最后n个元素,请使用arr.splice(-n)(注意“splice”中的“p”)。返回值将是包含已删除元素的新数组。

更简单的方法是,对于n == 1,使用val = arr.pop()


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