Удалить последний элемент из массива


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

Используйте сплайс (индекс, сколько)

arr.splice(-1,1)

1
@PrithvirajMitra Вы хотите удалить 1 и 0? Итак, массив == [2]?
Антон

3
Не работает для одноэлементных массивов: [1].splice(-1, 1)=>[1]
Tvaroh

135
это не лучшее решение, Best is pop function. Не это.
Tommix

6
Pop сам по себе будет возвращать только значение последнего элемента. Если я правильно понимаю, @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качестве параметра начала, который указывает смещение от конца последовательности. Итак, 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
ломтик лучше, так как он не изменяет исходный массив
user365314

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 Спасибо за то, что обратили внимание на это :)
Lukas Liesis

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


6

arr.slice(-1)вернет копию последнего элемента массива, но оставит исходный массив без изменений.

Чтобы удалить последние nэлементы из массива, используйтеarr.splice(-n) (обратите внимание на «p» в «соединении»). Возвращаемым значением будет новый массив, содержащий удаленные элементы.

Еще проще, для 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

Чем отличается этот ответ ?
Мпасков

Да, это правда, но этот более сложный. Ваш ответ для начинающего сложно понять.
Разат наик

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

splice (index, howmany) - это решение звучит хорошо. Но этот способ будет работать только для положительного индекса массива. Чтобы удалить последние два или три элемента, используйте сам индекс.

Например, сращивание (-2), чтобы удалить два последних элемента. сращивание (-3) для удаления трех последних элементов.


3

С Lodash вы можете использовать dropRight , если вам не важно знать, какие элементы были удалены:

_.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 ]

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

3

Решение 2019 ECMA5:

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

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


после смены или после толчка вам нужен еще один реверс, чтобы снова получить правильный порядок
cyptus

Обратное инвертирует исходный массив.
Поймал

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.