В этой теме уже есть много замечательных ответов. Однако я хотел поделиться своим опытом, когда попытался решить «удалить 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
метод чрезвычайно важен для достижения неизменности в функциональном программировании по принципу избыточности