从数组中删除最后一项


440

我有以下数组。

var arr = [1,0,2];

我想删除最后一个元素,即2。

我使用过,arr.slice(-1);但不会删除值。




3
arr.splice(-1,1)将返回数组[1,0];arr.slice(-1,1)将返回给您[2]
Anja Ishmukhametova 2015年

10
arr.slice(0,-1)对我来说是最好的解决方案
Black Mamba

3
这个问题有点模棱两可,因为“删除最后一个元素”可能意味着从数组中删除该元素并保留数组(少一个元素)。但这也可能意味着删除元素并保留该元素。第一种情况:splice(),第二种情况:pop()
thoni56 '18

Answers:


517

使用拼接(索引,多个)

arr.splice(-1,1)

1
@PrithvirajMitra您要删除1和0?那么数组== [2]?
安东

3
不适用于单元素数组:[1].splice(-1, 1)=>[1]
Tvaroh 2014年

135
这不是最好的解决方案,最好的是弹出功能。不是这个。
Tommix'1

6
单独弹出只会返回最后一个元素的值。如果我理解正确,@PrithvirajMitra需要两件事:1)从原始数组中删除最后一个元素,以及2)以单个元素数组的形式返回该元素-即:[0,1,2] -> [2],留在后面[0,1]。如果是这样,那么[arr.pop()]就可以解决问题。
本·赫尔

11
注意,array.pop()将更改Modify array,而slice(0, -1)不会更改。流行音乐当然更快,但可能并不总是适合所有需求。
adelriosantiago

621

Array.prototype.pop()通过JavaScript约定。

let fruit = ['apple', 'orange', 'banana', 'tomato'];
let popped = fruit.pop();

console.log(popped); // "tomato"
console.log(fruit); // ["apple", "orange", "banana"]

7
Array.prototype.pop()似乎是最快的jsperf.com/slice-vs-splice-vs-pop/3-
丹尼尔(Daniel)

1
使用pop()时,请确保不要执行jQuery('#foo')。val(numbers.pop()),除非您只想将数组的最后一项放入字段中。pop()返回删除的元素。正如斯图尔特所做的那样,首先要做numbers.pop(); 然后执行jQuery('#foo')。val(numbers)...
查尔斯·罗伯逊

4
最佳解决方案+1
mdlars,

2
拥有unpop()返回数组其余部分的感觉很酷。
eomeroff '18年

2
有什么办法做到这一点,同时保持数组不变?
nayiaw

263

您可以使用以下.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,2]因为0在这里位于位置1,之后的所有位置。现在,在您的情况下,您已经传递了一个负索引,即-1作为begin参数,它指示与序列末尾的偏移量。因此,slice(-1)在您的情况下,提取序列中的最后一个数组元素,即2如上例中所见)。

现在,让我们endslice()这里讨论方法语法中的参数。它还是从零开始的索引,从数组的提取在此结束。所以,可以说我们有一个像这样的数组:

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为end参数,因此我们的代码就像

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个位置以及do like的位置arr.slice(0, 22)。然后,您可以在此处简单地实现负索引逻辑并执行

arr.slice(0, -1) // same result as arr.slice(0, 22)

希望能帮助到你!


11
这很好用,只要确保您注意到这是对.slice()的调用,而不是对.s p lice()的调用。
Brian Hasden 2014年

4
应当注意,此解决方案不会从数组中删除最后一项,arr而是返回一个排除最后一项的新数组。正如Mozilla的文档所说:“ slice()方法将数组的一部分的浅表副本返回到新的数组对象中。”
F Lekschas,2015年

4
该问题的示例代码隐式地询问如何获取一个从原始数组中删除了最后一个值的新数组。所以arr.slice(0, -1)是最好的答案。
Tsounabe '16

4
slice更好,因为它不会修改原始数组
user365314 '19

66

通过示例学习:

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

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

13
这应该是公认的答案,因为它说明了大多数错误。>返回所需的数组以所需的方式更改数组。
RaisingAgent

1
@RaisingAgent感谢您注意到这些事情:)
Lukas Liesis

43

您将需要执行此操作,因为slice这不会更改原始数组。

arr = arr.slice(-1);

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

arr.splice(-1, 1);

pop

arr.pop();

22

我认为.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
感谢dude,这是我需要使用的确切示例。我很感激:)
Barry Michael Doyle '18

2
这是最正确的答案。可耻的是其他人排名更高。
mmla


12

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

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

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

8

只需在您的用例中使用以下内容:

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

请注意。当您执行pop()函数时,即使该行返回弹出的项目,原始数组也会生效,并且弹出的元素将被删除。


7

您可以使用splice()以下两种方式进行操作:

  1. arr.splice(-1,1)
  2. arr.splice(arr.length-1,1)

splice(position_to_start_deleting, how_many_data_to_delete) 接受两个参数。

position_to_start_deleting :从零开始的索引,从此处开始删除。 how_many_data_to_delete:应从指示的索引中删除多少个连续数据。

您也可以使用pop()as pop()删除最后一个元素,因为as 从某个数组中删除了最后一个元素。
采用arr.pop()


6

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

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

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



5

此方法对于删除和存储数组的最后一个元素更有用。

var sampleArray = [1,2,3,4];// Declaring the array
var lastElement = sampleArray.pop();//this command will remove the last element of `sampleArray` and stores in a variable called `lastElement` so that you can use it if required.

现在的结果是:

console.log(sampleArray); //This will give you [1,2,3]
console.log(lastElement); //this will give you 4

这个答案有何不同?
mpaskov '16

是的,但这是更详细的。对于初学者来说,您的答案很难理解。
razat naik

4

值得一提的是,slice都将返回一个新的数组,而.pop().splice()会产生变异的现有阵列。

如果您喜欢使用链式命令样式处理数据集合,那么您将非常愿意坚持使用 slice这样的事情。

例如:

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the last item
  .map(x => `The number is: ${x}`);// map to a set of strings

要使用“ pop”做同样的事情,可能需要更多的麻烦和变量管理,因为与mapfilter等等,你没有得到一个新的阵列回来。

与的情况相同push,后者会在数组的末尾添加一个项目。这样做可能会更好,concat因为这样可以使流程继续进行。

myArray = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];

var newArrayOfThings = myArray
  .filter(x => x > 5)              // only bigly things
  .slice(-1)                       // get rid of the "10"
  .concat([100])                   // note with concat, you must pass an array
  .map(x => `The number is: ${x}`) // map to a set of strings
  


3

splice(index,howmany)-这个解决方案听起来不错。但这种的howmany只会工作的积极数组索引。要删除最后两个或三个项目,请使用索引本身。

例如,splice(-2)删除最后两个项目。splice(-3)用于删除最后三个项目。



3
var a = [1,2,3,4,5,6]; 
console.log(a.reverse().slice(1).reverse());
//Array(5) [ 1, 2, 3, 4, 5 ]

尽管此代码可以回答问题,但提供有关如何和/或为什么解决问题的其他上下文将提高​​答案的长期价值。
Vasilisa

3

2019 ECMA5解决方案:

const new_arr = arr.reduce((d, i, idx, l) => idx < l.length - 1 ? [...d, i] : d, [])

无损,通用,单线,只需要在阵列末尾复制并粘贴即可。


1
“非破坏性”听起来并不像原始问题想要的那样I would like to remove the last element 。这需要对原始数组进行破坏/变异操作。
Ben Hull


1

这是删除最后一项的好方法:

if (arr != null && arr != undefined && arr.length > 0) {
      arr.splice(arr.length - 1, 1);
}

拼接细节如下:

拼接(startIndex,拼接数)


1
var stack = [1,2,3,4,5,6];

stack.reverse().shift();

stack.push(0);

输出将是:Array [0,1,2,3,4,5]。这将使您在推入新值时保持相同数量的数组元素。


您需要在换班后或再次按下按钮后再次
颠倒

反向反转原始数组。让我陷入困境...说一两次...
Simon_Weaver

1

另一种方法是根据索引进行过滤:

arr.filter((element, index) => index < arr.length - 1);

注意:filter()创建新数组,不更改现有数组。


0

如果要从javascript数组末尾删除n个项目,可以轻松使用:

arr.splice(-n, n);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.