У цій темі вже є багато чудових відповідей. Однак я хотів поділитися своїм досвідом, коли я намагався вирішити "видалити 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
Метод є надзвичайно важливим для досягнення незмінності в функціональному програмуванні ля Redux