В этой теме уже есть много замечательных ответов. Однако я хотел поделиться своим опытом, когда попытался решить «удалить n-й элемент из массива» в контексте ES5.
Массивы JavaScript имеют разные методы для добавления / удаления элементов из начала или конца. Это:
arr.push(ele) - To add element(s) at the end of the array
arr.unshift(ele) - To add element(s) at the beginning of the array
arr.pop() - To remove last element from the array
arr.shift() - To remove first element from the array
По сути, ни один из вышеперечисленных методов не может быть использован напрямую для удаления n-го элемента из массива.
Факт, который стоит отметить, заключается в том, что это контрастирует с Java-итератором
используя который можно убрать n-й элемент для коллекции
во время итерации.
Это в основном оставляет нам только один метод массива Array.splice
для выполнения удаления n-го элемента (есть и другие вещи, которые вы могли бы сделать с этими методами, но в контексте этого вопроса я сосредоточился на удалении элементов) :
Array.splice(index,1) - removes the element at the index
Вот код, скопированный из исходного ответа (с комментариями):
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter else it would run into IndexOutBounds exception
{
if (arr[i] === "four" || arr[i] === "two") {
//splice modifies the original array
arr.splice(i, 1); //never runs into IndexOutBounds exception
console.log("Element removed. arr: ");
} else {
console.log("Element not removed. arr: ");
}
console.log(arr);
}
Другой заслуживающий внимания метод - Array.slice
. Однако тип возвращаемого значения этого метода - удаленные элементы. Также это не изменяет исходный массив. Изменен фрагмент кода следующим образом:
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter
{
if (arr[i] === "four" || arr[i] === "two") {
console.log("Element removed. arr: ");
console.log(arr.slice(i, i + 1));
console.log("Original array: ");
console.log(arr);
}
}
Сказав это, мы все еще можем использовать Array.slice
для удаления n-го элемента, как показано ниже. Однако это намного больше кода (следовательно, неэффективно)
var arr = ["one", "two", "three", "four"];
var i = arr.length; //initialize counter to array length
while (i--) //decrement counter
{
if (arr[i] === "four" || arr[i] === "two") {
console.log("Array after removal of ith element: ");
arr = arr.slice(0, i).concat(arr.slice(i + 1));
console.log(arr);
}
}
Метод Array.slice
чрезвычайно важен для достижения
неизменность в функциональном программировании à la redux