从数组中删除最后一项

Pri*_*tra 388 javascript arrays slice

我有以下数组.

var arr = [1,0,2];
Run Code Online (Sandbox Code Playgroud)

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

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

Stu*_*haw 545

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

console.log(popped); // "tomato"
console.log(fruit); // ["apple", "orange", "banana"]
Run Code Online (Sandbox Code Playgroud)

MDN上Array.prototype.pop的文档

  • Array.prototype.pop()似乎是最快的http://jsperf.com/slice-vs-splice-vs-pop/3 (6认同)
  • @nayiaw 是的,ES6 扩展语法: `letfruit = ['apple', 'orange', 'banana', 'tomato'];` `let popped = [...fruit].pop();` popped then equals `tomato` 和水果仍然等于 `['apple', 'orange', 'banana', 'tomato']`。 (5认同)
  • 最佳解决方案+1 (4认同)
  • 有什么方法可以在保持数组不可变的同时做到这一点吗? (4认同)
  • 拥有unpop()返回数组其余部分的感觉很酷。 (2认同)

Ant*_*ton 474

使用拼接(索引,howmany)

arr.splice(-1,1)
Run Code Online (Sandbox Code Playgroud)

  • 这不是最佳解决方案,Best是pop功能.不是这个. (111认同)
  • Pop本身只会返回最后一个元素的值.如果我理解正确,@ PrithvirajMitra需要两件事:1)从原始数组中删除最后一个元素,并且2)将该元素作为单个元素数组返回 - 即:`[0,1,2] - > [2] `,留下`[0,1]`.如果是这种情况,那么`[arr.pop()]`就可以了. (4认同)
  • 请注意,array.pop()将更改修改array,而slice(0,-1)则不会。流行音乐当然更快,但可能并不总是适合所有需求。 (3认同)
  • 不适用于单元素数组:`[1] .splice(-1,1)`=>`[1]` (2认同)

pal*_*aѕн 233

您可以使用以下.slice()方法执行此操作:

arr.slice(0, -1);    // returns [1,0]
Run Code Online (Sandbox Code Playgroud)

这是一个演示:

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

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

而不是做:

arr.slice(-1);   // returns [2]
Run Code Online (Sandbox Code Playgroud)

这是一个演示:

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

console.log(newArr);
$('#div1').text('[' + arr + ']');
$('#div2').text('[' + newArr + ']');
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

说明:-

现在Array.prototype.slice(),简短slice()方法的基本语法是:

arr.slice([begin[, end]])
Run Code Online (Sandbox Code Playgroud)

这里,

所述begin参数是一个数组开始处提取从零的索引.所以,我们可以根据上面的例子说,如果我们做类似的事情

arr.slice(0)    // returns [1,0,2]
Run Code Online (Sandbox Code Playgroud)

它将从位置0的序列开始返回所有数组元素,即[1,0,2].同样,如果我们这样做

arr.slice(1)    // returns [0,2]
Run Code Online (Sandbox Code Playgroud)

它将返回,[0,2]因为0在这里的位置1以及之后的所有内容.现在,在您的情况下,您已经传递了一个负索引,即,-1作为begin参数,它指示从序列末尾的偏移量.因此,slice(-1)在您的情况下,提取序列中的最后一个数组元素2(就像我们在上面的演示中已经看到的那样).

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

var arr = [1, 0, 2, 5, 3, 9];
Run Code Online (Sandbox Code Playgroud)

我们想要获得2,5,3数组中的元素.现在,位置2从序列的开始是2和最后一个元素,3它是4.我们需要在这里结束提取位置5,因为我们需要在该位置之前获取元素.所以,我们将slice()在这里简单地实现方法

arr.slice(2, 5)    // returns [2,5,3]
Run Code Online (Sandbox Code Playgroud)

在你的情况下,我们已经实现-1了end参数,所以我们的代码就像

arr.slice(0, -1)   // returns [1,0]
Run Code Online (Sandbox Code Playgroud)

作为负指数,end表示距序列末尾的偏移量.因此,slice(0,-1)通过序列中倒数第二个元素提取第一个元素.所以,我们得到了理想的输出.我们也可以这样做

arr.slice(0, 2)    // returns [1,0]
Run Code Online (Sandbox Code Playgroud)

我们将获得相同的输出.但是,我在-1这里使用它更容易实现,即使对于长数组也是如此

[0,2,3,1,2,9,3,6,3,9,1,0,2,9,0,1,1,2,3,4,7,9,1]
Run Code Online (Sandbox Code Playgroud)

如果你只是想删除最后一个元素,你不想在这里坐下来计算最后9个的位置arr.slice(0, 22).然后,您可以在此处简单地实现负索引逻辑

arr.slice(0, -1) // same result as arr.slice(0, 22)
Run Code Online (Sandbox Code Playgroud)

希望能帮助到你!

  • 这很好用,只要确保你注意到这是对.slice()的调用而不是.s**p**lice(). (9认同)
  • slice 更好,因为它不会修改原始数组 (4认同)
  • 应该注意的是,这个解决方案**不会从数组`arr`中删除**最后一项,而是返回一个排除最后一项的新数组.正如Mozilla的文档所说:"slice()方法将数组的一部分的浅表副本返回到新的数组对象中." (3认同)
  • 问题的示例代码隐式地询问如何从原始数组中删除最后一个值的新数组.所以`arr.slice(0,-1)`是最好的答案. (2认同)

Luk*_*kas 54

通过实例学习:

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]
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案,因为它说明了什么是__错误.>返回你想要的数组**或**以你想要的方式改变数组. (10认同)

Bil*_*ell 37

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

arr = arr.slice(-1);
Run Code Online (Sandbox Code Playgroud)

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

arr.splice(-1, 1);
Run Code Online (Sandbox Code Playgroud)

或者pop:

arr.pop();
Run Code Online (Sandbox Code Playgroud)


Wan*_*nes 18

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

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

只是一个注释。当您执行pop()函数时,即使该行返回弹出的项目,原始数组也会受到影响并删除弹出的元素。


Mat*_*ius 16

我认为.pop()这是最"正确"的解决方案,但是有时它可能不起作用,因为你需要使用没有最后一个元素的数组......

在这种情况下,您可能想要使用以下内容

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

[1,2,3]将返回this(.pop()):

var arr = [1,2,3,4];
console.log(arr.pop());
Run Code Online (Sandbox Code Playgroud)

这可能不太可取......

希望这能为您节省一些时间.

  • 这是最正确的答案.令人遗憾的是其他人排名更高. (2认同)

Kri*_*hna 12

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

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

var arr = [1,0,2]; 
var popped = arr.pop();//Now arr = [1,0] & popped = 2
Run Code Online (Sandbox Code Playgroud)


Sah*_*mar 10

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);
Run Code Online (Sandbox Code Playgroud)


Har*_*hid 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()作为pop()从某个数组中删除最后一个元素.
使用arr.pop()


Aln*_*tak 6

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

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

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


Eln*_*oor 6

另一种方法是基于索引进行过滤:

arr.filter((element, index) => index < arr.length - 1);
Run Code Online (Sandbox Code Playgroud)

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


小智 5

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

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


小智 5

var arr = [1,0,2];
arr.length--; 
Run Code Online (Sandbox Code Playgroud)

// 移除最后一个元素 // 需要检查 arr.length > 0


raz*_*aik 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.
Run Code Online (Sandbox Code Playgroud)

现在的结果是:

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


小智 5

值得注意的是,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
Run Code Online (Sandbox Code Playgroud)

它可以需要更多的折腾了,和可变管理,做同一种用“流行”的东西,因为不像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
  
Run Code Online (Sandbox Code Playgroud)


Dap*_*que 5

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