Usuń ostatni element z tablicy


440

Mam następującą tablicę.

var arr = [1,0,2];

Chciałbym usunąć ostatni element, tj. 2.

Użyłem, arr.slice(-1);ale nie usuwa wartości.




3
arr.splice (-1,1) zwróci ci tablicę [1,0]; arr.slice (-1,1) wróci do ciebie [2]
Anja Ishmukhametova

10
arr.slice(0,-1)było dla mnie najlepszym rozwiązaniem
Black Mamba

3
Pytanie jest nieco dwuznaczne, ponieważ „usuń ostatni element” może oznaczać usunięcie elementu z tablicy i utrzymanie tablicy (z jednym elementem mniej). Ale może to również oznaczać usunięcie elementu i zachowanie elementu. Pierwszy przypadek: splice()drugi przypadek: pop().
thoni56

Odpowiedzi:


517

Użyj splice (indeks, howmany)

arr.splice(-1,1)

1
@PrithvirajMitra Chcesz usunąć 1 i 0? Więc tablica == [2]?
Anton

3
Nie działa dla tablic jednoelementowych: [1].splice(-1, 1)=>[1]
Tvaroh

135
to NIE jest najlepsze rozwiązanie, najlepsza jest funkcja pop. Nie to.
Tommix

6
Pop sam zwróci tylko wartość ostatniego elementu. Jeśli dobrze rozumiem, @PrithvirajMitra chce dwóch rzeczy: 1) Aby usunąć ostatni element z oryginalnej tablicy, i 2) zwrócić ten element jako tablicę z jednym elementem - tj .: [0,1,2] -> [2]pozostawiając za sobą [0,1]. W takim przypadku [arr.pop()]zrobi to samo.
Ben Hull

11
Zauważ, że array.pop()zmieni modyfikację array, a slice(0, -1)nie zmieni. Pop jest oczywiście szybszy, ale nie zawsze może być odpowiedni dla wszystkich potrzeb.
adelriosantiago

621

Array.prototype.pop () według konwencji 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 () wydaje się być najszybszym jsperf.com/slice-vs-splice-vs-pop/3
Daniel

1
Używając pop (), pamiętaj, aby nie robić jQuery ('# foo'). Val (numbers.pop ()), chyba że chcesz wstawić tylko ostatni element tablicy w pole. pop () zwraca usunięty element. Tak jak zrobił to Stuart, najpierw wykonaj numbers.pop (); a następnie wykonaj jQuery ('# foo'). val (liczby) ...
Charles Robertson

4
Najlepsze rozwiązanie +1
mdlars

2
fajnie byłoby mieć unpop (), który zwraca resztę tablicy.
eomeroff,

2
Jakiś sposób to zrobić, utrzymując tablicę niezmienną?
nayiaw

263

Możesz to zrobić przy użyciu .slice()metody takiej jak:

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

Oto demo:

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>

zamiast robić:

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

Oto demo:

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>

Wyjaśnienie:-

Teraz podstawową składnią Array.prototype.slice()lub w skrócie slice()jest:

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

Tutaj,

beginparametr zera wskaźnik na jakim wyrzutu z rozpoczęciem tablicy. Powiedzmy na podstawie powyższego przykładu, jeśli zrobimy coś takiego

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

zwróci wszystkie elementy tablicy od początku sekwencji od pozycji 0 i to znaczy [1,0,2]. Podobnie, jeśli to zrobimy

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

powróci, [0,2]ponieważ 0 jest tutaj na pozycji 1, a potem wszystko. Teraz w twoim przypadku minąłeś indeks ujemny, tj. -1Jako parametr początkowy, który wskazuje przesunięcie od końca sekwencji. Tak więc, slice(-1)w przypadku ekstraktów ostatni element tablicy w kolejności i to 2( jak widzieliśmy już w powyższym demo ).

Teraz porozmawiajmy o endparametrze w slice()składni metody tutaj. Jest to ponownie indeks zerowy, przy którym kończy się ekstrakcja z tablicy. Powiedzmy, że mamy tablicę typu: -

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

i chcemy uzyskać tylko 2,5,3elementy z tablicy. Teraz pozycja 2od początku sekwencji jest 2i dla ostatniego elementu 3jest 4. Będziemy musieli zakończyć ekstrakcję tutaj pozycję 5, ponieważ musimy zdobyć element przed tą pozycją. Tak więc po prostu zaimplementujemy slice()tutaj metodę jak

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

W twoim przypadku zaimplementowaliśmy -1jako parametr końcowy, więc nasz kod jest podobny

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

Jako indeks ujemny endwskazuje przesunięcie od końca sekwencji. Wyodrębnia więc slice(0,-1)pierwszy element od drugiego do ostatniego elementu w sekwencji. Otrzymujemy więc pożądaną wydajność. Możemy również zrobić jak

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

otrzymamy taką samą wydajność. Ale użyłem -1tutaj, ponieważ jest łatwiejszy do wdrożenia, nawet dla długiej tablicy

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

Jeśli chcesz po prostu usunąć ostatni element, nie chcesz usiąść i obliczyć pozycji ostatnich 9 tutaj i zrobić to arr.slice(0, 22). Następnie możesz po prostu zaimplementować logikę indeksu ujemnego tutaj i wykonaj

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

Mam nadzieję, że to pomoże!


11
Działa to doskonale, tylko upewnić się, można zauważyć, że jest to wezwanie do .slice (), a nie do .S p wszy ().
Brian Hasden

4
Należy zauważyć, że to rozwiązanie nie usuwa ostatniego elementu z tablicy, arrale zwraca nową tablicę, która wyklucza ten ostatni element. Jak mówią dokumenty Mozilli: „Metoda slice () zwraca płytką kopię części tablicy do nowego obiektu tablicy.”.
F Lekschas,

4
Przykładowy kod pytania domyślnie pyta, jak uzyskać nową tablicę z ostatnią wartością usuniętą z oryginalnej tablicy. Tak arr.slice(0, -1)jest najlepsza odpowiedź.
Tsounabe,

4
wycinek jest lepszy, ponieważ nie modyfikuje oryginalnej tablicy
user365314

66

ucz się na przykładzie:

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
To powinna być zaakceptowana odpowiedź, ponieważ ilustruje to, co najbardziej się myli. > Zwracanie żądanej tablicy LUB mutowanie tablicy w żądany sposób.
RaisingAgent

1
@ RaisingAgent Dziękujemy za zauważenie tych rzeczy :)
Lukas Liesis

43

Musisz to zrobić, ponieważ slicenie zmienia oryginalnej tablicy.

arr = arr.slice(-1);

Jeśli chcesz zmienić oryginalną tablicę, możesz użyć splice:

arr.splice(-1, 1);

lub pop:

arr.pop();

22

Uważam to za .pop()najbardziej „poprawne” rozwiązanie, jednak czasami może nie działać, ponieważ musisz użyć tablicy bez ostatniego elementu ...

W takim przypadku możesz skorzystać z następujących opcji, funkcja zwróci [1,2,3]

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

podczas gdy .pop()wróci 4:

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

co może być niepożądane ...

Mam nadzieję, że to pozwoli Ci zaoszczędzić trochę czasu.


1
Dzięki koleś, to jest dokładnie ten przykład, którego muszę użyć. Doceniam to :)
Barry Michael Doyle

2
To jest najbardziej poprawna odpowiedź. Szkoda, że ​​inni zajęli wyższe miejsca.
mmla


12

Możesz po prostu użyć arr.pop()

Spowoduje to usunięcie ostatniego wpisu tablicy.

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

8

Po prostu skorzystaj z następujących opcji dla swojego przypadku użycia:

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

Tylko uwaga. Gdy wykonasz pop()funkcję, mimo że linia zwraca wyskakujący element, zachowana jest oryginalna tablica i usuwany jest wyskakujący element.


7

Możesz to zrobić na dwa sposoby, używając splice():

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

splice(position_to_start_deleting, how_many_data_to_delete) przyjmuje dwa parametry.

position_to_start_deleting: Indeks liczony od zera, od którego zacząć usuwanie. how_many_data_to_delete: Ze wskazanego indeksu, ile kolejnych danych należy usunąć.

Możesz także usunąć ostatni element, używając pop()as pop()usuwa ostatni element z jakiejś tablicy.
Posługiwać sięarr.pop()


6

arr.slice(-1)zwróci kopię ostatniego elementu tablicy, ale pozostawi oryginalną tablicę niezmodyfikowaną.

Aby usunąć ostatnie nelementy z tablicy, użyjarr.splice(-n) (zwróć uwagę na „p” w „splice”). Zwrócona wartość będzie nową tablicą zawierającą usunięte elementy.

Jeszcze prostsze w n == 1użyciuval = arr.pop()


5
var arr = [1,0,2];
arr.length--; 

// usuwa ostatni element // trzeba sprawdzić, czy arr. długość> 0


5

Ta metoda jest bardziej przydatna do usuwania i przechowywania ostatniego elementu tablicy.

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.

Teraz wyniki są następujące:

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

Czym różni się ta odpowiedź ?
mpaskov

Tak, to prawda, ale ta jest bardziej rozbudowana. Twoja odpowiedź jest trudna do zrozumienia dla początkującego.
razat naik

4

Warto zauważyć, że slicezarówno zwróci nową tablicę, jak .pop()i .splice()zmutuje istniejącą tablicę.

Jeśli lubisz obsługiwać kolekcje danych w stylu łańcucha poleceń, naprawdę będziesz chciał się trzymać slice czegoś takiego.

Na przykład:

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

To może wymagać dużo bardziej ingerować i zmienną zarządzania, do tego samego rodzaju rzeczy z „pop”, ponieważ w przeciwieństwie do map,filter itp, nie dostaniesz nową tablicę plecy.

Jest to ten sam rodzaj rzeczy push, który dodaje element na końcu tablicy. Lepiej może być, concatponieważ pozwala to utrzymać płynność.

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) - To rozwiązanie brzmi dobrze. Ale to howmany będzie działać tylko dla pozytywnego indeksu tablicy. Aby usunąć ostatnie dwa lub trzy elementy, użyj samego indeksu.

Na przykład połącz (-2), aby usunąć ostatnie dwa elementy. łączenie (-3) do usuwania ostatnich trzech przedmiotów.


3

Z Lodash możesz użyć dropRight , jeśli nie chcesz wiedzieć, które elementy zostały usunięte:

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

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

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

Chociaż ten kod może odpowiedzieć na pytanie, zapewnienie dodatkowego kontekstu dotyczącego tego, jak i / lub dlaczego rozwiązuje problem, poprawiłoby długoterminową wartość odpowiedzi.
Vasilisa

3

Rozwiązanie ECMA5 2019:

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

Nieniszczący, ogólny, jednowarstwowy i wymaga tylko kopiowania i wklejania na końcu tablicy.


1
„Nieniszczące” nie brzmi jak co oryginalne pytanie chce: I would like to remove the last element . To wymaga niszczącej / mutującej operacji na oryginalnej tablicy.
Ben Hull

2

powiedz, że masz var arr = [1,0,2]

arr.splice(-1,1)wróci do ciebie, array [1,0];a arr.slice(-1,1)wróci do ciebiearray [2];


1

To dobry sposób na usunięcie ostatniego elementu:

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

Szczegóły splotu, jak następuje:

splice (startIndex, liczba splice)


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

stack.reverse().shift();

stack.push(0);

Dane wyjściowe to: Array [0,1,2,3,4,5] . Pozwoli ci to zachować taką samą liczbę elementów tablicy, jak wpychasz nową wartość.


potrzebujesz kolejnej zmiany kierunku po zmianie lub po naciśnięciu, aby ponownie uzyskać właściwą kolejność
cyptus

Odwróć odwraca pierwotną tablicę. Złapał mnie ... powiedzmy raz lub dwa ...
Simon_Weaver

1

Innym podejściem jest filtrowanie na podstawie indeksu:

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

Uwaga: filter()tworzy nową tablicę, nie zmienia istniejącej.


0

Jeśli chcesz usunąć n elementu z końca tablicy w javascript, możesz łatwo użyć:

arr.splice(-n, n);
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.