O método de travessia mais usado é para declarações (também recursivas e enquanto). Quando atravessamos uma matriz, geralmente fazemos isso:
A cópia do código é a seguinte:
var arr = [1,2,3,4,5,6,7,8,9,10];
for (var i = 0, total = arr.length; i <total; i ++) {
console.log (i, arr [i]);
}
Este é o método de travessia mais comumente usado: travessia de ordem positiva. Ele vai do primeiro item da matriz para o último item.
Então, por que o pequeno drama ainda menciona a travessia de ordem reversa hoje?
Aqui, devemos mencionar o módulo mais usado no componente escrito por Xiaoju: Events. Usado para criar modelos de eventos personalizados, lidar com a escuta e acionamento de eventos, o modo de publicação e inscrição mais simples. Como recentemente descobriu que existe um perigo oculto do transbordamento de memória, é necessário adicionar um método para desbaste na base original.
Como a função de retorno de chamada com o mesmo nome de evento é colocada na mesma matriz, a desbaste requer apenas encontrar a função de retorno de chamada correspondente da matriz (a mesma função de retorno de chamada pode estar ligada várias vezes) e removê -la.
É um requisito muito simples, então eu naturalmente escrevi um código semelhante ao seguinte:
A cópia do código é a seguinte:
// Remova 2 na matriz
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// atender às condições, remova
Arr.splice (i, 1);
}
}
console.log (arr);
Não há código normal, mas a saída final é: [1, 2, 2, 1, 1, 2]. Obviamente, o resultado da execução não atende às expectativas.
Qual é o problema?
Após uma análise cuidadosa, descobri que o problema é que toda vez que a partida é bem -sucedida, depois de executar a operação de remoção, o próximo item a ser verificado será ignorado porque cada item da matriz aumentará um por um.
Encontrei o problema, mudei o código e, depois de executar a operação de remoção, ajusto o índice de sequência (i).
A cópia do código é a seguinte:
// Remova 2 na matriz
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = 0, total = arr.length; i <total; i ++) {
if (arr [i] == 2) {
// atender às condições, remova
Arr.splice (i, 1);
// ajuste o índice de sequência
i = i-1;
}
}
console.log (arr);
O problema foi resolvido, mas sempre sinto que a modificação do índice de sequência é um truque para fazer um loop for. Então, um lampejo de inspiração, e um tapa, e o código a seguir foi eliminado:
A cópia do código é a seguinte:
// Remova 2 na matriz
var arr = [1,2,2,2,2,1,1,2,2];
for (var i = arr.length-1; i! =-1; i-) {
if (arr [i] == 2) {
// atender às condições, remova
Arr.splice (i, 1);
}
}
console.log (arr);
O processo de travessia permanece inalterado. A única coisa que muda é que a ordem da Traversal mudou. A propósito, também há uma variável total ausente.
Ok, admito que o que escrevi hoje é muito sedoso, mas, através deste exemplo, lembro -o ao escrever código no futuro. Durante o processo de travessia, se envolver modificar a própria matriz (adicionando e excluindo), a travessia reversa é um método de travessia relativamente seguro.
Notas de codificação, deixe -as zombar de si mesmo no futuro!
Indique a fonte para reimpressão: http://bh-lay.com/blog/148C07761FA