Qual é a diferença entre usar o delete
operador no elemento da matriz em vez de usar o Array.splice
método ?
Por exemplo:
myArray = ['a', 'b', 'c', 'd'];
delete myArray[1];
// or
myArray.splice (1, 1);
Por que usar o método de emenda se eu posso excluir elementos da matriz como posso com objetos?
javascript
arrays
array-splice
delete-operator
lYriCAlsSH
fonte
fonte
.splice
loops in, dê uma olhada nesta pergunta: Exclua da matriz em javascript .delete
eArray.prototype.splice
.Respostas:
delete
excluirá a propriedade do objeto, mas não reindexará a matriz nem atualizará seu comprimento. Isso faz com que pareça indefinido:Observe que, na verdade, ele não está definido como o valor
undefined
, mas a propriedade é removida da matriz, fazendo com que ela pareça indefinida. As ferramentas de desenvolvimento do Chrome tornam essa distinção clara ao imprimirempty
ao registrar a matriz.myArray.splice(start, deleteCount)
na verdade remove o elemento, reindexa a matriz e altera seu comprimento.fonte
delete
ele remove o elemento, mas não reindexa a matriz nem atualiza seu comprimento (o que já está implícito no primeiro, pois o comprimento é sempre o índice mais alto + 1).delete myArray[0]
sintaxe dizendo " Esperava um operador e viu 'delete'. "splice
É recomendável usar .delete myArray[0]
emyArray[0] = undefined
. No primeiro caso, a propriedade é removida totalmente do objeto da matriz. No segundo caso, a propriedade permanece com o valorundefined
.empty
vez deundefined
melhorar a distinção entre um elemento de matriz realmente excluído (ou não inicializado) versus um elemento com o valor real deundefined
. Observe que, enquanto digo isso, quero dizer que apenas é exibido comoempty
e não se refere a um valor real chamadoempty
(que não existe).Método Array.remove ()
John Resig , criador do jQuery, criou um
Array.remove
método muito útil que eu sempre o uso em meus projetos.e aqui estão alguns exemplos de como ele pode ser usado:
John's website
fonte
[1,2,3].slice('1'); // =[2,3]
), por isso é mais seguro para alterá-lo paravar rest = this.slice(parseInt(to || from) + 1 || this.length);
this.push.apply(this, rest)
, em seguida, retorna o valor que ele voltoufor(var i in array)
ciclo. Eu o removi e usei a emenda.Como delete remove apenas o objeto do elemento na matriz, o comprimento da matriz não muda. A emenda remove o objeto e reduz a matriz.
O código a seguir exibirá "a", "b", "undefined", "d"
Considerando que isso exibirá "a", "b", "d"
fonte
myArray.splice(2,1)
Eu me deparei com essa pergunta enquanto tentava entender como remover todas as ocorrências de um elemento de uma matriz. Aqui está uma comparação de
splice
edelete
para remover todos'c'
os daitems
matriz.fonte
Do Core JavaScript 1.5 Referência> Operadores> Operadores Especiais> delete Operator :
fonte
splice
funcionará com índices numéricos.Considerando que
delete
pode ser usado contra outro tipo de índices.exemplo:
fonte
Também vale a pena mencionar que a emenda só funciona em matrizes. (Não é possível confiar nas propriedades do objeto para seguir uma ordem consistente.)
Para remover o par de valores-chave de um objeto, excluir é realmente o que você deseja:
fonte
excluir Vs emenda
quando você exclui um item de uma matriz
quando você emenda
em caso de exclusão, o elemento é excluído, mas o índice permanece vazio
enquanto no caso do elemento de emenda é excluído e o índice de elementos de repouso é reduzido de acordo
fonte
Como afirmado muitas vezes acima, o uso
splice()
parece ser um ajuste perfeito. Documentação na Mozilla:fonte
delete age como uma situação não real, apenas remove o item, mas o comprimento da matriz permanece o mesmo:
exemplo do terminal do nó:
Aqui está uma função para remover um item de uma matriz por índice, usando slice () , ela recebe o arr como o primeiro argumento e o índice do membro que você deseja excluir como o segundo argumento. Como você pode ver, ele realmente exclui o membro da matriz e reduz o comprimento da matriz em 1
O que a função acima faz é levar todos os membros até o índice e todos os membros após o índice, concatená-los juntos e retornar o resultado.
Aqui está um exemplo usando a função acima como um módulo de nó, pois o terminal será útil:
observe que isso não funcionará em uma matriz com dupes, porque indexOf ("c") obterá a primeira ocorrência e somente emendar e remover o primeiro "c" encontrado.
fonte
Se você deseja iterar uma matriz grande e excluir elementos seletivamente, seria caro chamar splice () para cada exclusão, porque splice () precisaria re-indexar os elementos subseqüentes a cada vez. Como matrizes são associativas em Javascript, seria mais eficiente excluir os elementos individuais e indexar novamente a matriz posteriormente.
Você pode fazer isso criando uma nova matriz. por exemplo
Mas não acho que você possa modificar os valores-chave na matriz original, o que seria mais eficiente - parece que você precisará criar uma nova matriz.
Observe que você não precisa verificar as entradas "indefinidas", pois elas realmente não existem e o loop for não as retorna. É um artefato da impressão em matriz que os exibe como indefinidos. Eles não parecem existir na memória.
Seria bom se você pudesse usar algo como slice (), que seria mais rápido, mas não é re-indexado. Alguém sabe de uma maneira melhor?
Na verdade, você provavelmente pode fazer isso da seguinte maneira, o que provavelmente é mais eficiente, em termos de desempenho:
fonte
você pode usar algo assim
fonte
slice
se você vier de um plano de fundo funcional (provavelmente menos eficiente, no entanto).Por que não apenas filtrar? Eu acho que é a maneira mais clara de considerar as matrizes em js.
fonte
delete
ouslice
para mim.A diferença pode ser observada registrando o comprimento de cada matriz após a aplicação do
delete
operador e dosplice()
método. Por exemplo:operador de exclusão
O
delete
operador remove o elemento da matriz, mas o "espaço reservado" do elemento ainda existe.oak
foi removido, mas ainda ocupa espaço na matriz. Por esse motivo, o comprimento da matriz permanece 5.método splice ()
O
splice()
método remove completamente o valor de destino e o "espaço reservado" também.oak
foi removido, bem como o espaço usado para ocupar na matriz. O comprimento da matriz é agora 4.fonte
exemplo:
banana é excluída e comprimento da matriz = 2
fonte
São coisas diferentes que têm propósitos diferentes.
splice
é específico da matriz e, quando usado para excluir, remove as entradas da matriz e move todas as entradas anteriores para cima para preencher a lacuna. (Também pode ser usado para inserir entradas, ou ambas ao mesmo tempo.)splice
Alterará olength
da matriz (supondo que não seja uma chamada não operacional:)theArray.splice(x, 0)
.delete
não é específico da matriz; Ele foi projetado para uso em objetos: remove uma propriedade (par chave / valor) do objeto em que você a usa. Aplica-se apenas a matrizes porque matrizes padrão (por exemplo, não digitadas) em JavaScript não são realmente matrizes *, são objetos com tratamento especial para determinadas propriedades, como aquelas cujos nomes são "índices de matriz" (que são definido como nomes de sequência "... cujo valor numéricoi
está no intervalo+0 ≤ i < 2^32-1
") elength
. Quando você usadelete
para remover uma entrada de matriz, tudo o que faz é remover a entrada; ele não move outras entradas que o seguem para preencher a lacuna e, portanto, a matriz se torna "esparsa" (algumas entradas estão ausentes totalmente). Não tem efeitolength
.Algumas das respostas atuais para esta pergunta afirmam incorretamente que o uso de
delete
"define a entrada comoundefined
". Isso não está correto. Ele remove a entrada (propriedade) inteiramente, deixando uma lacuna.Vamos usar algum código para ilustrar as diferenças:
* (esse é um post no meu blog anêmico)
fonte
Atualmente, existem duas maneiras de fazer isso
usando splice ()
arrayObject.splice(index, 1);
usando delete
delete arrayObject[index];
Mas eu sempre sugiro usar emenda para objetos de matriz e excluir para atributos de objeto, porque excluir não atualiza o comprimento da matriz.
fonte
OK, imagine que temos esta matriz abaixo:
Vamos excluir primeiro:
e este é o resultado:
esvaziar! e vamos entender:
Então, significa apenas o valor excluído e está indefinido agora; portanto, o comprimento é o mesmo, também retornará verdadeiro ...
Vamos redefinir nossa matriz e fazê-lo com emenda desta vez:
e este é o resultado desta vez:
Como você vê, o comprimento da matriz mudou e agora
arr[1]
é 3 ...Além disso, isso retornará o item excluído em uma matriz,
[3]
neste caso ...fonte
Outros já compararam corretamente
delete
comsplice
.Outra comparação interessante é
delete
contraundefined
: um item de matriz excluído usa menos memória do que aquele que acabou de ser definidoundefined
;Por exemplo, este código não será concluído:
Produz este erro:
Então, como você pode ver,
undefined
ocupa realmente a memória heap.No entanto, se você também
delete
o item ário (em vez de apenas configurá-lo comoundefined
), o código será concluído lentamente:Estes são exemplos extremos, mas eles enfatizam
delete
que nunca vi ninguém mencionar em lugar algum.fonte
Se você tiver uma matriz pequena, poderá usar
filter
:fonte
A maneira mais fácil é provavelmente
Espero que isto ajude. Referência: https://lodash.com/docs#compact
fonte
compact
... não há necessidade de lodash. TentemyArray.filter(function(n){return n;})
Para quem quiser usar o Lodash pode usar:
myArray = _.without(myArray, itemToRemove)
Ou como eu uso no Angular2
fonte
Excluir elemento da última
Excluir elemento do primeiro
Excluir do meio
Excluir um elemento do último
Excluir usando o número de índice da matriz
fonte
Se o elemento desejado a ser excluído estiver no meio (digamos que queremos excluir 'c', cujo índice é 1), você pode usar:
fonte
IndexOf
aceita também um tipo de referência. Suponha o seguinte cenário:Diferentemente:
fonte
// resultado: myArray = ['b', 'c', 'd'];
fonte