Как удалить элемент из массива в JavaScript?

340
var arr = [1,2,3,5,6];

Удалить первый элемент

Я хочу удалить первый элемент массива, чтобы он стал:

var arr = [2,3,5,6];

Удалить второй элемент

Чтобы расширить этот вопрос, что если я захочу удалить второй элемент массива, чтобы он стал:

var arr = [1,3,5,6];
user198729
источник
1
slice(start, end)не 'how_many_to_remove'
seanjacob
2
@Ped arr.unshift () не УДАЛЯЕТ, но «добавляет один или несколько элементов в начало массива»
psycho brm
@ seanjacob это spliceне sliceя думаю.
Анимеш Сингх

Ответы:

346

Для более гибкого решения используйте splice()функцию. Это позволяет вам удалить любой элемент в массиве на основе значения индекса:

var indexToRemove = 0;
var numberToRemove = 1;

arr.splice(indexToRemove, numberToRemove);
Габриэль МакАдамс
источник
12
И дополнительный вопрос: arr.splice(1,1)для второго элемента.
Slebetman
1
Я предпочитаю splice()более shift()потому , что его более гибким. Я могу захотеть сделать что-то другое в будущем, и не всегда я хочу удалить только один элемент или даже первый элемент.
Габриэль Макадамс
14
Если вы пришли сюда из Google: Габриэль предпочитает этот ответ, но вы должны знать, что есть также shift (), см. Ответ Джозефа.
Шернандес
668

shift()идеально подходит для вашей ситуации. shift()удаляет первый элемент из массива и возвращает этот элемент. Этот метод изменяет длину массива.

array = [1, 2, 3, 4, 5];

array.shift(); // 1

array // [2, 3, 4, 5]
JP Silvashy
источник
Это работает, но удалит только первый элемент в массиве.
Габриэль МакАдамс
53
@ Габриэль: не был ли этот вопрос? Я предпочитаю , shift()чтобы , splice(..., ...)поскольку он гораздо более явным, прямой.
Бруно Рейс
6
Исправление: возвращает первый элемент, а не новый массив минус первый элемент, согласно предоставленной вами ссылке :)
DanH
Хотя пример кода верен, описание вводит в заблуждение: (а) как указывает @DanH, это первый возвращаемый элемент , и (б) тот факт, что входной массив изменен , неясен. Поэтому ответ Педа выше.
mklement0
2
shiftбыстрее, если вы не объединяете большие списки jsperf.com/splice-vs-shift3 и jsperf.com/splice-vs-shift2
kcathode
61

Array.prototype.shiftМетод удаляет первый элемент из массива и возвращает его. Он изменяет исходный массив.

var a = [1,2,3]
// [1,2,3]
a.shift()
// 1
a
//[2,3]
p3drosola
источник
4
Большое улучшение в ответе Джозефа Сильваши - нет несоответствий между описанием и кодом.
mklement0
48
arr.slice(begin[,end])

не разрушителен, сращивание и сдвиг изменят ваш исходный массив

kiuma
источник
3
Да, не мутировав. Это должно быть более заметным.
пользователь
16

Написал небольшую статью о вставке и удалении элементов в произвольных позициях в массивах Javascript.

Вот небольшой фрагмент, чтобы удалить элемент из любой позиции. Это расширяет класс Array в Javascript и добавляет метод remove (index).

// Remove element at the given index
Array.prototype.remove = function(index) {
    this.splice(index, 1);
}

Итак, чтобы удалить первый элемент в вашем примере, вызовите arr.remove ():

var arr = [1,2,3,5,6];
arr.remove(0);

Чтобы удалить второй элемент,

arr.remove(1);

Вот небольшая статья с методами вставки и удаления для класса Array.

По сути, это ничем не отличается от других ответов, использующих сплайсинг, но имя не spliceявляется интуитивно понятным, и, если у вас есть такой вызов во всем приложении, это только затрудняет чтение кода.

Анураг
источник
14

Может быть, что-то вроде этого:

arr=arr.slice(1);
ThatGuyYouKnow
источник
7

Другие ответы велики, я просто хотел бы добавить альтернативное решение с ES6функцией массива: filter.

filter() создает новый массив с элементами, которые подпадают под данный критерий из существующего массива.

Таким образом, вы можете легко использовать его для удаления элементов, которые не соответствуют критериям. Преимущества этой функции в том, что вы можете использовать ее для сложного массива, а не только для строки и числа.

Некоторые примеры :

Удалить первый элемент :

// Not very useful but it works
function removeFirst(element, index) {
  return index > 0;
}
var arr = [1,2,3,5,6].filter(removeFirst); // [2,3,4,5,6]

Удалить второй элемент :

function removeSecond(element, index) {
  return index != 1;
}
var arr = [1,2,3,5,6].filter(removeSecond); // [1,3,4,5,6]

Удалить нечетный элемент :

function removeOdd(element, index) {
  return !(element % 2);
}
var arr = [1,2,3,5,6].filter(removeOdd); [2,4,6]

Удалить товары, которых нет в наличии

const inventory = [
  {name: 'Apple', qty: 2},
  {name: 'Banana', qty: 0},
  {name: 'Orange', qty: 5}
];

const res = inventory.find( product => product.qty > 0);

Мартин Хорейн
источник
2

Вы можете использовать функцию ES6 Destructuring Assignment с оператором отдыха. Запятая указывает, где вы хотите удалить элемент и оператор остатка (... arr), чтобы получить остальные элементы массива.

const source = [1,2,3,5,6];

function removeFirst(list) {
   var  [, ...arr] = list;
   return arr;
}
const arr = removeFirst(source);
console.log(arr); // [2, 3, 5, 6]
console.log(source); // [1, 2, 3, 5, 6]

Brendan
источник
1

Array.splice()имеет интересное свойство, которое нельзя использовать для удаления первого элемента. Итак, нам нужно прибегнуть к

function removeAnElement( array, index ) {
    index--;

    if ( index === -1 ) {
        return array.shift();
    } else {
        return array.splice( index, 1 );
    }
}
Габриэль Шульхоф
источник
3
Array.splice (0,1) удаляет первый элемент. В соответствии с любым другим ответом здесь, и в соответствии с developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… . Кроме того, зачем кому-то передавать -1, чтобы удалить первый элемент? Разве они не пройдут 0?
Камень
@skypecakes Я не могу говорить о достоверности сращивания по 0-му индексу, но здесь индекс уменьшается перед этой проверкой, поэтому он был бы равен 0 при передаче.
Джейк Т.
Да, это определенно может удалить первый элемент. Я проверил это здесь: jsfiddle.net/sijpkes/d87rcLob/2
sijpkes
1

Решение Typescript, которое не изменяет исходный массив

function removeElementAtIndex<T>(input: T[], index: number) {
  return input.slice(0, index).concat(input.slice(index + 1));
}
pie6k
источник
1

Есть несколько способов удалить элемент из массива. Позвольте мне указать наиболее часто используемые варианты ниже. Я пишу этот ответ, потому что я не смог найти правильную причину того, что использовать из всех этих опций. Ответ на вопрос - вариант 3 ( Splice () ).

1) SHIFT () - удалить первый элемент из исходного массива и вернуть первый элемент

См. Ссылку для Array.prototype.shift () . Используйте это, только если вы хотите удалить первый элемент, и только если вы в порядке с изменением исходного массива.

const array1 = [1, 2, 3];

const firstElement = array1.shift();

console.log(array1);
// expected output: Array [2, 3]

console.log(firstElement);
// expected output: 1

2) SLICE () - возвращает копию массива, разделенного начальным индексом и конечным индексом

Смотрите ссылку на Array.prototype.slice () . Вы не можете удалить определенный элемент из этой опции. Вы можете взять только часть существующего массива и получить непрерывную часть массива. Это как вырезать массив из указанных вами индексов. Исходный массив не затрагивается.

const animals = ['ant', 'bison', 'camel', 'duck', 'elephant'];

console.log(animals.slice(2));
// expected output: Array ["camel", "duck", "elephant"]

console.log(animals.slice(2, 4));
// expected output: Array ["camel", "duck"]

console.log(animals.slice(1, 5));
// expected output: Array ["bison", "camel", "duck", "elephant"]

3) SPLICE () - изменить содержимое массива, удалив или заменив элементы по определенным индексам.

См. Ссылку на Array.prototype.splice () . Метод splice () изменяет содержимое массива, удаляя или заменяя существующие элементы и / или добавляя новые элементы на месте. Возвращает обновленный массив. Исходный массив обновляется.

const months = ['Jan', 'March', 'April', 'June'];
months.splice(1, 0, 'Feb');
// inserts at index 1
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "June"]

months.splice(4, 1, 'May');
// replaces 1 element at index 4
console.log(months);
// expected output: Array ["Jan", "Feb", "March", "April", "May"]
Кит Сугатхадаса
источник
0

Вы также можете сделать это с помощью Reduce:

let arr = [1, 2, 3]

arr.reduce((xs, x, index) => {
        if (index == 0) {
            return xs
        } else {
            return xs.concat(x)
        }
    }, Array())

// Or if you like a oneliner
arr.reduce((xs, x, index) => index == 0 ? xs : xs.concat(x), Array())
Я ЛУЧШИЙ
источник