Já existem muitas respostas maravilhosas neste tópico. No entanto, eu queria compartilhar minha experiência ao tentar resolver "remover o enésimo elemento da matriz" no contexto do ES5.
As matrizes JavaScript têm métodos diferentes para adicionar / remover elementos do início ou do fim. Esses são:
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
Essencialmente, nenhum dos métodos acima pode ser usado diretamente para remover o enésimo elemento da matriz.
Um fato digno de nota é que isso contrasta com o uso do java iterator, no qual é possível remover o enésimo elemento de uma coleção durante a iteração.
Isso basicamente nos deixa com apenas um método de matriz Array.splice
para executar a remoção do enésimo elemento (há outras coisas que você poderia fazer com esses métodos também, mas no contexto desta pergunta, estou focando na remoção de elementos):
Array.splice(index,1) - removes the element at the index
Aqui está o código copiado da resposta original (com comentários):
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);
}
Outro método digno de nota é Array.slice
. No entanto, o tipo de retorno desse método são os elementos removidos. Além disso, isso não modifica a matriz original. Fragmento de código modificado da seguinte maneira:
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);
}
}
Dito isto, ainda podemos usar Array.slice
para remover o enésimo elemento, como mostrado abaixo. No entanto, é muito mais código (portanto ineficiente)
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);
}
}
O Array.slice
método é extremamente importante para obter imutabilidade na programação funcional à la redux