从数组中删除最后一项

Remove last item from array

提问人:Prithviraj Mitra 提问时间:10/23/2013 最后编辑:Martin BraunPrithviraj Mitra 更新时间:5/13/2023 访问量:1320603

问:

我有以下数组。

var arr = [1,0,2];

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

我用过,但它没有删除该值。arr.slice(-1);

JavaScript 数组 切片

评论

53赞 Tushar Gupta - curioustushar 10/23/2013
使用 arr.pop()
40赞 Black Mamba 2/17/2018
arr.slice(0,-1)对我来说是最好的解决方案
14赞 thoni56 7/22/2018
这个问题有点模棱两可,因为“删除最后一个元素”可能意味着从数组中删除元素并保留数组(少一个元素)。但这也可能意味着删除元素并保留元素。第一种情况:,第二种情况:。splice()pop()
1赞 Joby Joseph 8/10/2022
arr.length = arr.length - 1
1赞 Cadoiz 3/6/2023
@Anja Ishmukhametova 2015 年评论的代码格式:“ 将返回数组给你; 会回到你身边arr.splice(-1,1)[1,0]arr.slice(-1,1)[2]"

答:

106赞 Bill Criswell 10/23/2013 #1

您需要这样做,因为不会更改原始数组。slice

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

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

arr.splice(-1, 1);

或:pop

arr.pop();

评论

0赞 Cadoiz 3/6/2023
如果使用 ,则可以省略 as 删除 -th 中的所有元素,即后面的 -th。对于“最后一个”中的所有元素,与“最后一个”完全相同。.splice(-1,1),1splice(-x)-xx-1-x
740赞 Anton 10/23/2013 #2

使用 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赞 Anton 10/23/2013
@PrithvirajMitra 要删除 1 和 0?那么数组==[2] ?
1赞 Anton 10/23/2013
然后你可以执行这个arr.splice(0,2)@PrithvirajMitra
8赞 Tvaroh 11/1/2014
不适用于单元素数组:[1].splice(-1, 1) => [1]
6赞 Ben Hull 4/24/2017
Pop 本身只会返回最后一个元素的值。如果我理解正确的话,@PrithvirajMitra想要两件事:1)从原始数组中删除最后一个元素,以及2)将该元素作为单个元素数组返回 - 即:,留下。如果是这样的话,那么就可以了。[0,1,2] -> [2][0,1][arr.pop()]
47赞 adelriosantiago 9/23/2017
请注意,将更改 modify ,而不会。流行音乐当然更快,但可能并不总是适合所有需求。array.pop()arrayslice(0, -1)
981赞 Stuart Kershaw 10/23/2013 #3

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

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

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

评论

12赞 Daniel 3/2/2016
Array.prototype.pop() 似乎是最快的 jsperf.com/slice-vs-splice-vs-pop/3
1赞 Charles Robertson 5/12/2017
使用 pop() 时,请确保不要执行 jQuery('#foo').val(numbers.pop()),除非您只想将数组的最后一项放入字段中。pop() 返回删除的元素。正如 Stuart 所做的那样,首先执行 numbers.pop();然后执行 jQuery('#foo').val(numbers)...
7赞 eomeroff 12/12/2018
让 unpop() 返回数组的其余部分会很酷。
6赞 nayiaw 8/23/2019
有什么方法可以在保持数组不可变的同时做到这一点吗?
9赞 Stuart Kershaw 8/27/2019
@nayiaw 是的,ES6 传播语法:popped then equals and fruit still equals .let fruit = ['apple', 'orange', 'banana', 'tomato'];let popped = [...fruit].pop();tomato['apple', 'orange', 'banana', 'tomato']
19赞 JoDev 10/23/2013 #4

有一个功能,这里解释:

arr.pop();
14赞 Venkata Krishna 10/23/2013 #5

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

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

var arr = [1,0,2]; 
var popped = arr.pop();//Now arr = [1,0] & popped = 2
450赞 palaѕн 10/23/2013 #6

您可以使用 .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>

解释:-

现在 or in short 方法的基本语法是: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 位于此处的位置 1 以及之后的所有内容。现在,在您的例子中,您已经传递了一个负索引,即作为 begin 参数,它表示与序列末尾的偏移量。因此,在您的例子中,提取序列中的最后一个数组元素,即(正如我们在上面的演示中已经看到的那样)。[0,2]-1slice(-1)2

现在,让我们在这里谈谈方法语法中的参数。它又是一个从零开始的索引,从数组中提取结束。所以,假设我们有一个数组,如下所示:-endslice()

var arr = [1, 0, 2, 5, 3, 9];

我们只想得到数组中的元素。现在,从序列开始的位置是,对于最后一个元素,它是 。我们需要在这里结束位置 5 的提取,因为我们需要在该位置之前获取元素。因此,我们将在这里简单地实现方法,例如2,5,32234slice()

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

在你的例子中,我们已经实现了作为结束参数,所以我们的代码是这样的-1

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

作为负索引,表示与序列末尾的偏移量。因此,通过序列中的倒数第二个元素提取第一个元素。因此,我们得到了所需的输出。我们也可以做endslice(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 个的位置,然后像 .然后,您可以简单地在此处实现负索引逻辑 & doarr.slice(0, 22)

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

评论

17赞 Brian Hasden 10/18/2014
这很好用,只要确保你注意到这是对 .slice() 而不是 .splice() 的调用。
8赞 F Lekschas 10/8/2015
应该注意的是,此解决方案不会从数组中删除最后一项,而是返回一个排除最后一项的新数组。正如Mozilla的文档所说:“slice()方法将数组的一部分的浅拷贝返回到新的数组对象中。arr
6赞 Tsounabe 10/20/2016
该问题的示例代码隐式询问如何获取一个新数组,并从原始数组中删除最后一个值。最好的答案也是如此。arr.slice(0, -1)
6赞 user365314 1/30/2019
slice 更好,因为它不修改原始数组
12赞 Alnitak 10/23/2013 #7

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

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

更简单,用于n == 1val = arr.pop()

5赞 Parthyz 10/27/2014 #8

splice(index,howmany) - 这个解决方案听起来不错。但是这个 howmany 仅适用于正数组索引。若要删除最后两个项目或三个项目,请使用索引本身。

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

2赞 Anja Ishmukhametova 5/14/2015 #9

说你有var arr = [1,0,2]

arr.splice(-1,1)会回到你身边,而会回到你身边array [1,0];arr.slice(-1,1)array [2];

4赞 Nirav Shah 8/2/2016 #10
var arr = [1,0,2];
arr.length--; 

删除最后一个元素,但您可能需要先检查是否。arr.length > 0

评论

0赞 Cadoiz 3/6/2023
仅仅减少长度有什么副作用吗?(如内存泄漏等)
1赞 Jainish Jariwala 10/12/2016 #11

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

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

拼接细节如下:

splice(startIndex, 拼接数)

6赞 razat naik 11/15/2016 #12

此方法更有助于删除和存储 数组。

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

评论

0赞 mpaskov 11/15/2016
这和这个答案有什么不同?
0赞 razat naik 11/15/2016
是的,这是真的,但这个更详细。对于初学者来说,您的答案很难理解。
12赞 pete otaqui 12/5/2016 #13

值得注意的是,两者都将返回一个新数组,而 和 将改变现有数组。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(0, -1)                       // get rid of the last item ! slice(-1) will give first element
  .map(x => `The number is: ${x}`);// map to a set of strings

它可能需要更多的混乱和变量管理,才能对“pop”做同样的事情,因为与 、 等不同,你不会得到一个新的数组。mapfilter

这与 是一样的,它将一个项目添加到数组的末尾。你可能会更好,因为这样可以让你保持流动。pushconcat

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
  

181赞 Lukas Liesis 12/30/2016 #14

举例学习:

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 8/30/2018
这应该是公认的答案,因为它说明了大多数人会犯什么错误。> 返回所需的数组以所需的方式更改数组。
1赞 Lukas Liesis 3/25/2020
@RaisingAgent 感谢您注意到这些事情:)
3赞 Donald Shahini 5/6/2021
最完整的答案👌谢谢伙计!
0赞 Cadoiz 3/6/2023
如果使用 ,则可以省略 as 删除 -th 中的所有元素,即后面的 -th。对于“最后一个”中的所有元素,与“最后一个”完全相同。.splice(-1,1),1splice(-x)-xx-1-x
1赞 Lukas Liesis 3/8/2023
@Cadoiz像这样使用语言的默认设置很酷,但当你知道这种行为时,许多看到你的代码的开发人员可能没有这方面的知识,在我看来,当它被定义而不是跳过时,它更具可读性和更防错误。
1赞 Blackspade 2/20/2017 #15
var stack = [1,2,3,4,5,6];

stack.reverse().shift();

stack.push(0);

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

评论

0赞 cyptus 6/7/2017
您需要在轮班后或按下后再次倒车才能再次获得正确的订单
0赞 Simon_Weaver 3/3/2019
Reverse 反转原始数组。把我抓出来了......比方说一次或两次......
4赞 Tomas Buteler 8/27/2017 #16

使用 Lodash,您可以使用 dropRight,如果您不想知道删除了哪些元素:

_.dropRight([1, 2, 3])
// => [1, 2]

_.dropRight([1, 2, 3], 2);
// => [1]
31赞 Matas Vaitkevicius 10/26/2017 #17

我认为这是最“正确”的解决方案,但是,有时它可能不起作用,因为您需要在没有最后一个元素的情况下使用数组.......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 3/23/2018
谢谢伙计,这是我需要使用的确切示例。我很欣赏这种:)
2赞 mmla 6/29/2018
这是最正确的答案。可惜其他人排名更高。
0赞 Cadoiz 3/6/2023
您可以省略 in0arr.splice(0,arr.length-1)
9赞 Harun Or Rashid 5/30/2018 #18

您可以使用两种方式做到这一点: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

您还可以使用 as 从某个数组中删除最后一个元素。
pop()pop()arr.pop()

5赞 Daphoque 2/18/2019 #19
var a = [1,2,3,4,5,6]; 
console.log(a.reverse().slice(1).reverse());
//Array(5) [ 1, 2, 3, 4, 5 ]

评论

1赞 Vasilisa 2/18/2019
虽然此代码可以回答问题,但提供有关它如何和/或为什么解决问题的额外上下文将提高答案的长期价值。
3赞 Santiago M. Quintero 9/6/2019 #20

2019 ECMA5解决方案:

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

非破坏性、通用、单行,只需要在数组末尾复制和粘贴。

评论

1赞 Ben Hull 10/24/2019
“非破坏性”听起来不像原来的问题想要的那样:.这需要对原始阵列进行破坏性/突变操作。I would like to remove the last element
1赞 efirat 10/24/2019 #21

如果要在 javascript 中从数组末尾删除 n 项,您可以轻松地使用:

arr.splice(-n, n);
20赞 Wannes 12/12/2019 #22

只需将以下内容用于您的用例:

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

只是一个笔记。当您执行函数时,即使该行返回弹出的项,原始数组也会生效,并且弹出的元素将被删除。pop()

8赞 Elnoor 3/19/2020 #23

另一种方法是根据索引进行筛选:

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

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

2赞 Tudor Morar 7/11/2020 #24

使用点差运算符:

const a = [1,2,3]
const [, ...rest] = a.reverse();
const withoutLast = rest.reverse();
console.log(withoutLast)

0赞 Sumit Ramteke 8/12/2020 #25

简直就可以了。arr.splice(-1)

评论

0赞 Ardit Hyka 2/17/2021
不,要删除最后一项使用,并且它不是修改,它应该像以下方式保存:arr.slice(0, -1)var newArray = arr.slice(0, -1)
0赞 Sumit Ramteke 2/28/2021
我同意@diti,这只是我建议的速记。
-1赞 Ali Hamza Yaseen 2/8/2021 #26
// Setup
var myArray = [["John", 23], ["cat", 2]];

// Only change code below this line
var removedFromMyArray;
removedFromMyArray = myArray.pop()

评论

0赞 Logemann 2/8/2021
请在原始代码之外添加一些注释,以使其成为更好的答案。
-9赞 Arjix 7/15/2021 #27

我得到了最好的答案!

var array = [1, 2, 3, 4]
array.length = array.length - 1

console.log(array)
> [1, 2, 3]

老实说,JS 在这一点上是一个模因。

PS:这会影响变量及其任何引用,如果您不想影响变量的任何引用,您可以执行以下操作:

var array = [1, 2, 3, 4]
var modifiedArray = Array.from(array)
modifiedArray .length = modifiedArray .length - 1

console.log(modifiedArray )
> [1, 2, 3]

评论

7赞 Arjix 7/15/2021
这可能是一种不安全的方法,并且根据 javascript 的实现,它可能不起作用,因此不要使用它。
9赞 Sahil Thummar 5/6/2022 #28

var arr = [ 0, 1, 2, 3, 4, 5, 6, 7 ];

// using slice
arr = arr.slice(0, -1);
console.log('arr : ', arr);

// using splice
arr.splice(-1);
console.log('arr : ', arr);

// using pop
arr.pop();
console.log('arr : ', arr);

// using shift and reverse
arr.reverse().shift()
arr.reverse();
console.log('arr : ', arr);

// using spread Operator and reverse
const [, ...exceptLast] = arr.reverse();
arr = exceptLast.reverse();
console.log('arr : ', arr);

// removing last index
arr.length -= 1;
console.log('arr : ', arr);

评论

0赞 Cadoiz 3/6/2023
仅仅减少是否有任何副作用,例如内存泄漏等。(您在 Joby Joseph 的评论中的最后一个建议)否则,这是一个巧妙的解决方案。另一个注意事项:如果您在第二个建议中使用 as,则可以省略 as 删除 -th 中的所有元素,即后面的 -th。对于“最后一个”中的所有元素,与“最后一个”完全相同。lengtharr.length -= 1;.splice(-1,1),1splice(-x)-xx-1-x
0赞 Sahil Thummar 3/7/2023
arr.length -= 1;两者具有相同的含义。arr.length = arr.length - 1;
0赞 Cadoiz 3/7/2023
是的,当然,但这不是这样做是否有任何内存泄漏或其他副作用的问题。或者换一种说法:是否有一些 GC 知道“此元素已越界,因此被删除”? 事后给:这表明没问题。++arr.length"arr : ", [0, 1, undefined]
1赞 Everything Digital 3/7/2023 #29

如果您正在寻找不需要初始化多个变量的单行代码:

var arr = [1,0,2];

arr = arr.filter((_,i,a) => i !== (a.length-1));

解释: 我们使用的是数组筛选方法,它接受 3 个回调:

  1. element (_):迭代期间的当前元素
  2. index (i):元素迭代的索引
  3. array (a):用于筛选器的数组

因此,我们只需跳过该元素,它是正在使用的最后一个元素。ifarray

这只是一个占位符,因为我们实际上并没有使用它。_

评论

0赞 Everything Digital 3/7/2023
这样,将返回一个数组,而不是要删除的项目(使用 splice() 或 pop()