Видаліть останній елемент із масиву


441

У мене є такий масив.

var arr = [1,0,2];

Я хотів би видалити останній елемент, тобто 2.

Я використовував, arr.slice(-1);але це значення не видаляє.



36
використовувати arr .pop ()
Тушар Гупта - curioustushar

3
arr.splice (-1,1) повернеться до масиву [1,0]; arr.slice (-1,1) повернеться до вас [2]
Аня Ішмухаметова

10
arr.slice(0,-1)було найкращим рішенням для мене
Чорна мамба

3
Питання дещо неоднозначне, оскільки "видалити останній елемент" може означати видалення елемента з масиву та збереження масиву (з одним елементом менше). Але це також може означати видалення елемента і збереження елемента. Перший випадок: splice(), другий випадок: pop().
thoni56

Відповіді:


517

Використовуйте сплайс (індекс, howmany)

arr.splice(-1,1)

1
@PrithvirajMitra Ви хочете видалити 1 і 0? Отже масив == [2]?
Антон

3
Не працює для одноелементних масивів: [1].splice(-1, 1)=>[1]
Tvaroh

135
це НЕ найкраще рішення, Найкраще - поп-функція. Не це.
Tommix

6
Поп сам по собі поверне лише значення останнього елемента. Якщо я правильно розумію, @PrithvirajMitra хоче дві речі: 1) Видалити останній елемент з початкового масиву та 2) повернути цей елемент у вигляді масиву одного елемента - тобто:, [0,1,2] -> [2]залишивши позаду [0,1]. Якщо це так, то [arr.pop()]зробимо трюк.
Бен Халл

11
Зауважте, що array.pop()зміниться зміни 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
Даніель,

1
Використовуючи pop (), не забудьте робити jQuery ('# foo'). Val (numbers.pop ()), якщо ви не хочете лише помістити останній елемент масиву в поле. pop () повертає вилучений елемент. Як це зробив Стюарт, спочатку зробіть numbers.pop (); а потім зробіть jQuery ('# foo'). val (цифри) ...
Чарльз Робертсон

4
Краще рішення +1
mdlars

2
було б здорово мати unpop (), який повертає решту масиву.
eomeroff

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як параметр start, який вказує на зміщення від кінця послідовності. Отже, slice(-1)у вашому випадку витягує останній один елемент масиву в послідовності, і це 2( як ми вже бачили в наведеному вище демонстраційному демонстраційному описі ).

Тепер поговоримо про endпараметр у slice()синтаксисі методу тут. Це знову нульовий індекс, на якому закінчується витяг з масиву. Отже, скажімо, у нас є масив типу: -

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як кінцевий параметр, тому наш код схожий

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 тут і робити подібне arr.slice(0, 22). Потім ви можете просто реалізувати логіку негативного індексу тут і робити

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

Сподіваюся, це допомагає!


11
Це чудово працює, просто переконайтеся, що це заклик до .slice (), а не до .s p lice ().
Брайан Хасден

4
Слід зазначити, що це рішення не видаляє останній елемент з масиву, arrа повертає новий масив, який виключає цей останній елемент. Як кажуть документи Mozilla: "Метод slice () повертає дрібну копію частини масиву в новий об'єкт масиву."
F Lekschas

4
Зразок коду запитання неявно запитує, як отримати новий масив з останнім значенням, вилученим з вихідного масиву. Тож arr.slice(0, -1)найкраща відповідь.
Цунабе

4
Slice

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 Дякуємо за те, що помітили ці речі :)
Лукас Лейсіс

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
Спасибі чувак, це саме той приклад, який мені потрібно використовувати. Я ціную це :)
Баррі Майкл Дойл

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()як pop()видалення останнього елемента з якогось масиву.
Використовуйтеarr.pop()


6

arr.slice(-1)поверне копію останнього елемента масиву, але залишить початковий масив незмінним.

Щоб видалити останні nелементи з масиву, використовуйтеarr.splice(-n) (відзначте "p" у "splice"). Повертається значення буде новим масивом, що містить вилучені елементи.

Проте простіше n == 1використанняval = arr.pop()


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

// видаляє останній елемент // необхідно перевірити, чи arr.length> 0


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

Я правда, але ця детальніше. Вашу відповідь для початківця важко зрозуміти.
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", оскільки на відміну від map,filter і т.д., ви не отримаєте новий масив назад.

Це та сама річ 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

сплайс (індекс, howmany) - Це рішення звучить добре. Але цей howmany працюватиме лише для індексу позитивного масиву. Для видалення останніх двох або трьох елементів використовуйте сам індекс.

Наприклад, сплайс (-2) для видалення останніх двох елементів. сплайс (-3) для видалення останніх трьох елементів.



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

Хоча цей код може відповісти на питання, надаючи додатковий контекст щодо того, як та / або чому він вирішує проблему, покращить довгострокове значення відповіді.
Василіса

3

Рішення ECMA5 2019:

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 . Для цього потрібна руйнівна / мутаційна операція на вихідному масиві.
Бен Халл


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

Вихід буде: масив [0,1,2,3,4,5] . Це дозволить вам зберегти таку ж кількість елементів масиву, як і ви натискаєте нове значення.


вам потрібен ще один реверс після вашої зміни або після вашого натиску, щоб знову отримати правильний порядок
ципт

Зворотний результат обертає вихідний масив.
Зловив

1

Ще один підхід - фільтрація на основі індексу:

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

Примітка: filter()створює новий масив, не змінює існуючий.


0

Якщо ви хочете видалити n елемент з кінця масиву в JavaScript, ви можете легко використовувати:

arr.splice(-n, n);
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.