Encontre o index
elemento da matriz que você deseja remover usando indexOf
e remova esse índice com splice
.
O método splice () altera o conteúdo de uma matriz removendo os elementos existentes e / ou adicionando novos elementos.
const array = [2, 5, 9];
console.log(array);
const index = array.indexOf(5);
if (index > -1) {
array.splice(index, 1);
}
// array = [2, 9]
console.log(array);
O segundo parâmetro de splice
é o número de elementos a serem removidos. Observe que splice
modifica a matriz no local e retorna uma nova matriz contendo os elementos que foram removidos.
Por motivos de integridade, aqui estão as funções. Primeiro função remove ocorrência única único (isto é, a remoção do primeiro jogo 5
de [2,5,9,1,5,8,5]
), enquanto a segunda função remove todas as ocorrências:
function removeItemOnce(arr, value) {
var index = arr.indexOf(value);
if (index > -1) {
arr.splice(index, 1);
}
return arr;
}
function removeItemAll(arr, value) {
var i = 0;
while (i < arr.length) {
if(arr[i] === value) {
arr.splice(i, 1);
} else {
++i;
}
}
return arr;
}
array.indexOf(testValue)
na matriz vazia será -1, e se você estiver testando isso, não haverá emenda. Talvez a resposta tenha mudado desde então.Não sei como você espera
array.remove(int)
se comportar. Existem três possibilidades em que posso pensar que você pode querer.Para remover um elemento de uma matriz em um índice
i
:Se você deseja remover todos os elementos com valor
number
da matriz:Se você apenas deseja que o elemento no índice
i
não exista mais, mas não deseja que os índices dos outros elementos sejam alterados:fonte
delete
não é a maneira correta de remover um elemento de uma matriz!array.hasOwnProperty(i)
retornefalse
e faça com que o elemento nessa posição retorneundefined
. Mas admito que isso não é algo muito comum a se querer fazer.delete
não atualiza o comprimento da matriz nem apaga o elemento, apenas o substitui pelo valor especialundefined
.undefined
: remove o índice e o valor da matriz, ou sejadelete array[0]
, depois ,"0" in array
retornará false.delete
fazem a entender por que não funciona como elas esperam.Editado em outubro de 2016
Neste exemplo de código, uso a função "array.filter (...)" para remover itens indesejados de uma matriz. Esta função não altera a matriz original e cria uma nova. Se o seu navegador não suportar esta função (por exemplo, Internet Explorer antes da versão 9 ou Firefox antes da versão 1.5), considere usar o polyfill de filtro do Mozilla .
Removendo item (código ECMA-262 Edition 5, também conhecido como JavaScript à moda antiga)
Removendo item (código ECMAScript 6)
IMPORTANTE A sintaxe da função de seta ECMAScript 6 "() => {}" não é suportada no Internet Explorer, Chrome antes da versão 45, Firefox antes da versão 22 e Safari antes da versão 10. Para usar a sintaxe do ECMAScript 6 em navegadores antigos, você pode usar o BabelJS .
Removendo vários itens (código ECMAScript 7)
Uma vantagem adicional desse método é que você pode remover vários itens
A função "array.includes (...)" IMPORTANTE não é suportada no Internet Explorer, Chrome antes da versão 47, Firefox antes da versão 43, Safari antes da versão 9 e Safari antes da versão 9 e Edge antes da versão 14, então aqui está o polyfill do Mozilla .
Removendo vários itens (no futuro, talvez)
Se a proposta "Esta sintaxe de ligação" for aceita, você poderá fazer o seguinte:
Tente você mesmo no BabelJS :)
Referência
fonte
filter
deve ser muito mais lento para uma grande variedade embora?filter
pode ter um desempenho mais lento, mas é um código mais seguro e melhor. Além disso, você pode filtrar por índice especificando um segundo argumento no lambda:arr.filter((x,i)=>i!==2)
Depende se você deseja manter um local vazio ou não.
Se você deseja um slot vazio, a exclusão está correta:
Caso contrário, use o método de emenda :
E se você precisar do valor desse item, poderá apenas armazenar o elemento da matriz retornada:
Caso deseje fazer isso em alguma ordem, você pode usar
array.pop()
para o último ouarray.shift()
para o primeiro (e ambos retornam o valor do item também).E se você não souber o índice do item, poderá usá
array.indexOf(item)
-lo (em umif()
para obter um item ou em umwhile()
para obter todos eles).array.indexOf(item)
retorna o índice ou -1 se não for encontrado.fonte
delete
não é a maneira correta de remover um elemento de uma matriz !!array[index] = undefined;
. Usardelete
destruirá a otimização.Um amigo estava com problemas no Internet Explorer 8 e me mostrou o que ele fez. Eu disse a ele que estava errado, e ele me disse que conseguiu a resposta aqui. A resposta superior atual não funcionará em todos os navegadores (Internet Explorer 8, por exemplo) e somente removerá a primeira ocorrência do item.
Remova todas as instâncias de uma matriz
Ele percorre a matriz para trás (uma vez que os índices e o comprimento mudam à medida que os itens são removidos) e remove o item, se encontrado. Funciona em todos os navegadores.
fonte
i = arr.length -1
oui--
tornando-se mesmo que o índice máximo.arr.length
é apenas um valor inicial parai
.i--
sempre será verdade (e reduzirá 1 em cada loop op) até que seja igual0
(um valor falso) e o loop será interrompido.arr.filter(function (el) { return el !== item })
, evitando a necessidade de alterar a matriz várias vezes. Isso consome um pouco mais de memória, mas opera com muito mais eficiência, pois há menos trabalho que precisa ser feito.Existem duas abordagens principais:
emenda () :
anArray.splice(index, 1);
delete :
delete anArray[index];
Tenha cuidado ao usar excluir para uma matriz. É bom para excluir atributos de objetos, mas não tão bom para matrizes. É melhor usar
splice
para matrizes.Lembre-se de que, quando você usa
delete
uma matriz, pode obter resultados erradosanArray.length
. Em outras palavras,delete
removeria o elemento, mas não atualizaria o valor da propriedade length.Você também pode esperar ter buracos nos números de índice depois de usar a exclusão, por exemplo, pode acabar tendo os índices 1, 3, 4, 8, 9 e 11 e comprimento como eram antes de usar a exclusão. Nesse caso, todos os
for
loops indexados travariam, pois os índices não são mais seqüenciais.Se você for forçado a usar
delete
por algum motivo, deverá usarfor each
loops quando precisar percorrer matrizes. Na verdade, sempre evite usarfor
loops indexados , se possível. Dessa forma, o código seria mais robusto e menos propenso a problemas com índices.fonte
fonte
for in
em uma matriz, você já tem um problema.for in
matrizes, já terá problemas maiores.Não há necessidade de usar
indexOf
ousplice
. No entanto, ele funciona melhor se você deseja remover apenas uma ocorrência de um elemento.Localizar e mover (mover):
Uso
indexOf
esplice
(índice):Use apenas
splice
(emenda):Tempos de execução em nodejs para matriz com 1000 elementos (média acima de 10000 execuções):
indexof é aproximadamente 10x mais lento que o movimento . Mesmo se melhorou, removendo a chamada para
indexOf
a emenda ele executa muito pior do movimento .fonte
Isso fornece um predicado em vez de um valor.
NOTA: ele atualiza a matriz especificada e retorna as linhas afetadas.
Uso
Definição
fonte
Você pode fazer isso facilmente com o método de filtro :
Isso remove todos os elementos da matriz e também funciona mais rápido que uma combinação de
slice
eindexOf
.fonte
John Resig postou uma boa implementação :
Se você não deseja estender um objeto global, pode fazer algo como o seguinte:
Mas a principal razão pela qual estou postando isso é alertar os usuários contra a implementação alternativa sugerida nos comentários nessa página (14 de dezembro de 2007):
Parece funcionar bem no começo, mas através de um processo doloroso, descobri que ele falha ao tentar remover o penúltimo elemento de uma matriz. Por exemplo, se você tiver uma matriz de 10 elementos e tentar remover o 9º elemento com isso:
Você acaba com uma matriz de 8 elementos. Não sei por que, mas confirmei que a implementação original de John não tem esse problema.
fonte
Object.prototype.hasOwnProperty
sempre ¬¬O Underscore.js pode ser usado para resolver problemas com vários navegadores. Ele usa métodos de navegador embutidos, se presentes. Se estiverem ausentes, como no caso de versões mais antigas do Internet Explorer, ele usa seus próprios métodos personalizados.
Um exemplo simples para remover elementos da matriz (do site):
fonte
Você pode usar o ES6. Por exemplo, para excluir o valor '3' neste caso:
Resultado :
fonte
Se você deseja remover uma nova matriz com as posições excluídas, sempre pode excluir o elemento específico e filtrar a matriz. Pode ser necessário uma extensão do objeto de matriz para navegadores que não implementam o método de filtro, mas a longo prazo é mais fácil, pois tudo o que você faz é o seguinte:
Deve aparecer
[1, 2, 3, 4, 6]
.fonte
Confira este código. Funciona em todos os principais navegadores .
Chame esta função
fonte
for in
loop e o fato de o script poder parar mais cedo, retornando o resultado diretamente do loop. As votações são razoáveis;)for( i = 0; i < arr.length; i++ )
seria uma abordagem melhor, pois preserva os índices exatos versus a ordem em que o navegador decide armazenar os itens (comfor in
). Isso também permite obter o índice da matriz de um valor, se necessário.Você pode usar lodash _.pull (mutate array), _.pullAt (mutate array) ou _.without (não muda o array),
fonte
ES6 e sem mutação: (outubro de 2016)
fonte
filter
então?array.filter((_, index) => index !== removedIndex);
.A remoção de um elemento / string específico de uma matriz pode ser feita em uma única linha:
Onde:
theArray : a matriz da qual você deseja remover algo específico
stringToRemoveFromArray : a string que você deseja remover e 1 é a quantidade de elementos que você deseja remover.
NOTA : Se "stringToRemoveFromArray" não estiver localizado na sua matriz, isso removerá o último elemento da matriz.
É sempre uma boa prática verificar se o elemento existe em sua matriz primeiro, antes de removê-lo.
Se você tiver acesso a versões mais recentes do Ecmascript nos computadores do seu cliente (AVISO, pode não funcionar em estações mais antigas):
Onde '3' é o valor que você deseja remover da matriz. A matriz se tornaria:
['1','2','4','5','6']
fonte
"stringToRemoveFromArray"
não estiver localizado no seu array, isso removerá o último elemento do array.Aqui estão algumas maneiras de remover um item de uma matriz usando JavaScript .
Todo o método descrito não altera a matriz original e cria uma nova.
Se você conhece o índice de um item
Suponha que você tenha uma matriz e deseje remover um item na posição
i
.Um método é usar
slice()
:slice()
cria uma nova matriz com os índices que recebe. Simplesmente criamos uma nova matriz, do início ao índice que queremos remover e concatenamos outra matriz da primeira posição após a que removemos até o final da matriz.Se você conhece o valor
Nesse caso, uma boa opção é usar
filter()
, que oferece uma abordagem mais declarativa :Isso usa as funções de seta do ES6. Você pode usar as funções tradicionais para oferecer suporte a navegadores mais antigos:
ou você pode usar o Babel e transpilar o código ES6 de volta para o ES5 para torná-lo mais digerível para navegadores antigos e, ainda assim, escrever o JavaScript moderno em seu código.
Removendo vários itens
E se, em vez de um único item, você desejar remover muitos itens?
Vamos encontrar a solução mais simples.
Por índice
Você pode apenas criar uma função e remover itens em série:
Por valor
Você pode procurar por inclusão dentro da função de retorno de chamada:
Evite alterar a matriz original
splice()
(para não confundirslice()
) modifica a matriz original e deve ser evitada.(publicado originalmente em https://flaviocopes.com/how-to-remove-item-from-array/ )
fonte
OK, por exemplo, você tem a matriz abaixo:
E queremos excluir o número 4. Você pode simplesmente usar o código abaixo:
Se você estiver reutilizando essa função, escreva uma função reutilizável que será anexada à função de matriz nativa como abaixo:
Mas e se você tiver a matriz abaixo com alguns [5] s na matriz?
Precisamos de um loop para verificar todos eles, mas uma maneira mais fácil e eficiente é usar funções JavaScript integradas, por isso escrevemos uma função que usa um filtro como o abaixo:
Além disso, existem bibliotecas de terceiros que ajudam você a fazer isso, como Lodash ou Underscore. Para obter mais informações, consulte lodash _.pull, _.pullAt ou _.without.
fonte
this.splice(num.indexOf(x), 1);
=>this.splice(this.indexOf(x), 1);
Eu sou muito novo em JavaScript e precisava dessa funcionalidade. Eu apenas escrevi isso:
Então, quando eu quero usá-lo:
Saída - conforme o esperado. ["item1", "item1"]
Você pode ter necessidades diferentes das que eu, para poder modificá-las facilmente para atender a elas. Espero que isso ajude alguém.
fonte
Se você tiver objetos complexos na matriz, poderá usar filtros? Em situações em que $ .inArray ou array.splice não é tão fácil de usar. Especialmente se os objetos forem rasos na matriz.
Por exemplo, se você tem um objeto com um campo Id e deseja que o objeto seja removido de uma matriz:
fonte
Quero responder com base no ECMAScript 6 . Suponha que você tenha uma matriz como abaixo:
Se você deseja excluir em um índice especial como
2
, escreva o código abaixo:Mas se você deseja excluir um item especial como
3
e não conhece seu índice, faça o seguinte:Dica : use uma função de seta para o retorno de chamada do filtro, a menos que você obtenha uma matriz vazia.
fonte
Atualização: este método é recomendado apenas se você não puder usar o ECMAScript 2015 (anteriormente conhecido como ES6). Se você pode usá-lo, outras respostas aqui fornecem implementações muito mais claras.
Essa essência aqui resolverá seu problema e também excluirá todas as ocorrências do argumento em vez de apenas 1 (ou um valor especificado).
Uso:
fonte
atuação
Hoje (09/09/2019) realizo testes de desempenho no macOS v10.13.6 (High Sierra) para as soluções escolhidas. eu mostro
delete
(A), mas não o uso em comparação com outros métodos, porque deixou espaço vazio na matriz.As conclusões
array.splice
(C) (exceto o Safari para pequenas matrizes em que ocorre pela segunda vez)array.slice+splice
(H) é a solução imutável mais rápida para Firefox e Safari;Array.from
(B) é o mais rápido no ChromeDetalhes
Nos testes, removo o elemento do meio da matriz de maneiras diferentes. As soluções A, C estão em vigor. As soluções B, D, E, F, G, H são imutáveis.
Resultados para array com 10 elementos
No Chrome, o
array.splice
(C) é a solução local mais rápida. Oarray.filter
(D) é a solução imutável mais rápida. O mais lento éarray.slice
(F). Você pode executar o teste em sua máquina aqui .Resultados para array com 1.000.000 elementos
No Chrome, o
array.splice
(C) é a solução mais rápida no local (odelete
(C) é semelhante rapidamente - mas deixou um slot vazio na matriz (para não executar uma 'remoção completa')). Oarray.slice-splice
(H) é a solução imutável mais rápida. O mais lento éarray.filter
(D e E). Você pode executar o teste em sua máquina aqui .Mostrar snippet de código
Comparação para navegadores: Chrome v78.0.0, Safari v13.0.4 e Firefox v71.0.0
fonte
Você nunca deve alterar sua matriz. Como isso é contra o padrão de programação funcional. Você pode criar uma nova matriz sem fazer referência à matriz da qual deseja alterar os dados usando o método ECMAScript 6
filter
;Suponha que você queira remover
5
da matriz, basta fazê-lo da seguinte maneira:Isso fornecerá uma nova matriz sem o valor que você deseja remover. Então o resultado será:
Para um maior entendimento, você pode ler a documentação do MDN em Array.filter .
fonte
Uma abordagem mais moderna do ECMAScript 2015 (anteriormente conhecida como Harmony ou ES 6). Dado:
Então:
Produzindo:
Você pode usar o Babel e um serviço de polyfill para garantir que isso seja bem suportado nos navegadores.
fonte
.filter
retorna uma nova matriz, que não é exatamente o mesmo que remover o elemento da mesma matriz. O benefício dessa abordagem é que você pode encadear métodos de matriz juntos. por exemplo:[1,2,3].filter(n => n%2).map(n => n*n) === [ 1, 9 ]
splice
ouslice
.items= items.filter(x=>x!=3)
. Além disso, o OP não declarou nenhum requisito para um grande conjunto de dados.Você tem 1 a 9 na matriz e deseja remover 5. Use o código abaixo:
Se você deseja vários valores. Exemplo: - 1,7,8
Se você deseja remover um valor de matriz em uma matriz. Exemplo: [3,4,5]
Inclui navegador suportado é link .
fonte
Sei que já existem muitas respostas, mas muitas parecem complicar demais o problema. Aqui está uma maneira simples e recursiva de remover todas as instâncias de uma chave - chama auto até que o índice não seja encontrado. Sim, ele funciona apenas em navegadores com
indexOf
, mas é simples e pode ser facilmente preenchido com polyfilled.Função autônoma
Método de protótipo
fonte
Você pode fazer um loop para trás para garantir que não estrague os índices, se houver várias instâncias do elemento.
Demonstração ao vivo
fonte