ChatGPT解决这个技术问题 Extra ChatGPT

Remove last item from array

I have the following array.

var arr = [1,0,2];

I would like to remove the last element i.e. 2.

I used arr.slice(-1); but it doesn't remove the value.

use arr.pop()
arr.splice(-1,1) will return to you array [1,0]; arr.slice(-1,1) will return to you [2]
arr.slice(0,-1) was the best solution for me
The question is a bit ambiguous since "remove last element" might mean remove the element from the array and keep the array (with one element less). But it might also mean to remove the element and keep the element. First case: splice(), second case: pop().
If you have three apples and one is removed - how many do you have?

S
Stuart Kershaw

Array.prototype.pop() by JavaScript convention.

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

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

Array.prototype.pop() appears to be the fastest jsperf.com/slice-vs-splice-vs-pop/3
When using pop(), be sure not to do jQuery('#foo').val(numbers.pop()), unless you only want to place the last item of the array into the field. pop() returns the element removed. As Stuart has done, first do numbers.pop(); and then do jQuery('#foo').val(numbers)...
it would be cool to have unpop() that returns rest of the array.
Any way to do this while keeping the array immutable?
@nayiaw Yep, ES6 spread syntax: let fruit = ['apple', 'orange', 'banana', 'tomato']; let popped = [...fruit].pop(); popped then equals tomato and fruit still equals ['apple', 'orange', 'banana', 'tomato'].
a
ashleedawg

Use 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 );


@PrithvirajMitra You want to remove 1 and 0? So the array ==[2] ?
Then you can do this arr.splice(0,2) @PrithvirajMitra
Doesn't work for one-element arrays: [1].splice(-1, 1) => [1]
Pop on its own will only return the value of the last element. If I understand correctly, @PrithvirajMitra wants two things: 1) To remove the last element from the original array, and 2) return that element as a single element array - ie: [0,1,2] -> [2], leaving behind [0,1]. If that's the case, then [arr.pop()] will do the trick.
Note that array.pop() will change modify array, while slice(0, -1) will not. Pop is of course faster but may not be always suitable for all needs.
p
palaѕн

You can do this using .slice() method like:

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

Here is a demo:

var arr = [1, 0, 2]; var newArr = arr.slice(0, -1); // returns [1,0] console.log(newArr); $('#div1').text('[' + arr + ']'); $('#div2').text('[' + newArr + ']'); Original Array :


After slice(0, -1):

instead of doing :

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

Here is a demo:

var arr = [1, 0, 2]; var newArr = arr.slice(-1); // returns [2] console.log(newArr); $('#div1').text('[' + arr + ']'); $('#div2').text('[' + newArr + ']'); Original Array :


After slice(-1):

Explanation:-

Now the basic syntax of Array.prototype.slice() or in short slice() method is:

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

Here,

the begin parameter is zero-based index at which extraction from an array starts. So, lets say based on above example if we do something like

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

it would return all the array elements from start of sequence from position 0 and that is [1,0,2]. Similarly, if we do

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

it would return [0,2] since 0 is at position 1 here and everything after that. Now, in your case you have passed a negative index i.e., -1 as the begin parameter, which indicates an offset from the end of the sequence. So, slice(-1) in your case extracts the last one array element in the sequence and that is 2 (as we have already seen in the above demo).

Now, let's talk about the end parameter in the slice() method syntax here. It is again a zero-based index at which extraction from an array ends. So, lets say we have a array like:-

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

and we want to get just the 2,5,3 elements in the array. Now, position of 2 from start of the sequence is 2 and for last element 3 it is 4. We will need to end the extraction here a position 5, as we need to get the element before that position. So, we will simply implement slice() method here like

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

In your case, we have implemented -1 as the end parameter, so our code is like

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

As a negative index, end indicates an offset from the end of the sequence. So, slice(0,-1) extracts the first element through the second-to-last element in the sequence. So, we get the desired output. We can also do like

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

we will get the same output. But, I have used -1 here as its easier to implement even for a long array like

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

If you just want to remove the last element, you don't want to sit & calculate the position of last 9 here and the do like arr.slice(0, 22). You can then simply implement the negative index logic here & do

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

Hope it helps!


This works great, just make sure you notice that this is a call to .slice() and not to .splice().
It should be noted that this solution does not remove the last item from the array arr but rather returns a new array which excludes that last item. As Mozilla's docs say: "The slice() method returns a shallow copy of a portion of an array into a new array object.".
The sample code of the question implicitly ask how to get a new array with the last value removed from the original array. So arr.slice(0, -1) is the best answer.
slice is better since it doesn't modify original array
L
Lukas Liesis

learn by example:

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]

This should be the accepted answer as it illustrates what most get wrong. > Returning the array you want OR mutating the array in the way you want.
@RaisingAgent Thanks for noticing these things :)
Most complete answer👌 Thanks mate!
B
Bill Criswell

You would need to do this since slice doesn't alter the original array.

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

If you want to alter the original array you can use splice:

arr.splice(-1, 1);

or pop:

arr.pop();

use arr = arr.slice(0, -1); instead of arr = arr.slice(-1);
M
Matas Vaitkevicius

I would consider .pop() to be the most 'correct' solution, however, sometimes it might not work since you need to use array without the last element right there...

In such a case you might want to use the following, it will return [1,2,3]

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

while .pop() would return 4:

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

which might not be desirable...

Hope this saves you some time.


Thanks dude, this is the exact example that I need to use. I appreciate that :)
This is the most correct answer. Its a shame others have ranked higher.
J
JoDev

There is a function for that, explanation here:

arr.pop();

L
LordDraagon

Just use the following for your use case:

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

Just a note. When you execute pop() function even though the line returns the popped item the original array is effected and the popped element is removed.


V
Venkata Krishna

You could simply use, arr.pop()

This removes the last entry of the array.

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

I
IngoP

It's worth noting that slice will both return a new array, whereas .pop() and .splice() will mutate the existing array.

If you like handling collections of data with a chained command style, you will really want to stick with slice for something like this.

For example:

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

It can require a lot more messing about, and variable management, to do the same kind of thing with "pop", since unlike map, filter, etc, you don't get a new array back.

It's the same kind of thing with push, which adds an item to the end of an array. You might be better off with concat since that lets you keep the flow going.

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


A
Alnitak

arr.slice(-1) will return a copy of the last element of the array, but leaves the original array unmodified.

To remove the last n elements from an array, use arr.splice(-n) (note the "p" in "splice"). The return value will be a new array containing the removed elements.

Simpler yet, for n == 1, use val = arr.pop()


H
Harun Or Rashid

You can do it in two way using splice():

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

splice(position_to_start_deleting, how_many_data_to_delete) takes two parameter.

position_to_start_deleting : The zero based index from where to start deleting. how_many_data_to_delete : From indicated index, how many consecutive data should be deleted.

You can also remove the last element using pop() as pop() removes the last element from some array.
Use arr.pop()


r
razat naik

This method is more helpful to delete and store the last element of an array.

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.

Now the results are:

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

How is that different that this answer?
Ya thats true but this one is more elaborated. Your answer is difficult to understand for a beginner.
E
Elnoor

Another approach is to filter based on index:

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

Note: filter() creates new array, doesn't change existing one.


P
Parthyz

splice(index,howmany) - This solution sounds good. But This howmany will work only for the positive array index. To remove last two items or three items use the index itself.

For example, splice(-2) to remove last two items. splice(-3) for removing last three items.


N
Nirav Shah
var arr = [1,0,2];
arr.length--; 

// removes the last element // need to check if arr.length > 0


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

While this code may answer the question, providing additional context regarding how and/or why it solves the problem would improve the answer's long-term value.
T
Tomas Buteler

With Lodash you can use dropRight, if you don't care to know which elements were removed:

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

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

S
Sahil Thummar

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);


S
Santiago M. Quintero

2019 ECMA5 Solution:

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

Non destructive, generic, one-liner and only requires a copy & paste at the end of your array.


'Non destructive' doesn't sound like what the original question wants: I would like to remove the last element . That needs a destructive/mutating operation on the original array.
F
Félix Adriyel Gagnon-Grenier

say you have var arr = [1,0,2]

arr.splice(-1,1) will return to you array [1,0]; while arr.slice(-1,1) will return to you array [2];


J
Jainish Jariwala

This is good way to remove last item :

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

Detail of splice as following:

splice(startIndex, number of splice)


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

stack.reverse().shift();

stack.push(0);

Output will be: Array[0,1,2,3,4,5]. This will allow you to keep the same amount of array elements as you push a new value in.


you need another reverse after your shift or after your push to get the right order again
Reverse reverses the original array. Has caught me out... lets say once or twice...
e
efirat

If you want to remove n item from end of array in javascript, you can easily use:

arr.splice(-n, n);

T
Tudor Morar

Using the spread operator:

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


S
Sumit Ramteke

Simply arr.splice(-1) will do.


No, to remove last item use arr.slice(0, -1), and its not a modification, it should be saved like: var newArray = arr.slice(0, -1)
I agree @diti , it just a shorthand what I suggested.
A
Ali HaMza
// Setup
var myArray = [["John", 23], ["cat", 2]];

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

please add some comments apart from the raw code to make it a better answer.
A
ArjixGamer

I got the best answer!

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

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

Honestly JS is a meme at this point.

PS: This affects the variable and any of its references, if you want to not affect any of the variable's references you can do:

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

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

This is possibly an unsafe way of doing it and it might not work depending on the implementation of javascript, so don't use this.