7
respostas

Ajuda com meu código - busca com a função substring

Eiei pessoal,

Preciso de uma ajuda com o meu código.

Realizei uma implementação para realizar a busca com a substring ao invés de utilizar o RegExp.

A ideia era buscar a string que foi digitada no campo de entrada em qualquer parte do nome do paciente e não apenas no inicio, conforme a solução sugerida para o exercício. Não implementei o case insensitive.

Quando eu executo o meu código, ele me mostra a linha do nome do paciente apenas quando a string digitada está no inicio ou no fim do nome do paciente. Entretanto, quando ela está no meio, a linha não é mostrada.

Por exemplo... se eu digito "Tat" ou "ana" na entrada, ele encontra a paciente Tatiana (mantive o html inalterado). Entretanto, quando eu digito "tia", apesar de a expressão do if

if (this.value != expressao) {
          pacientes[i].classList.add("invisivel");
}else{
          pacientes[i].classList.remove("invisivel");
}

retornar false quando eu imprimo no log do console, a linha da paciente Tatiana não aparece.

Alguém pode me ajudar a entender porque isso está acontecendo?

Segue abaixo o meu código:

var campoFiltro = document.querySelector("#filtrar-tabela");

campoFiltro.addEventListener("input",function(){

  var pacientes = document.querySelectorAll(".paciente");

  if (campoFiltro.value.length > 0){

    for (var i=0; i<pacientes.length; i++){
      var nomeTd = pacientes[i].querySelector(".info-nome");
      var nomePaciente = nomeTd.textContent;
      var tamanhoNome = nomePaciente.length;
      var tamanhoCampoFiltro = campoFiltro.value.length;

      for (var j=0; j<= (tamanhoNome-tamanhoCampoFiltro); j++ ){
        var expressao = nomePaciente.substring(j,(j+tamanhoCampoFiltro));
        if (this.value != expressao) {
          pacientes[i].classList.add("invisivel");
        }else{
          pacientes[i].classList.remove("invisivel");
        }
      }
    }
  } else{
    for (var i=0; i<pacientes.length; i++){
      pacientes[i].classList.remove("invisivel");
    } 
  }    
});

Obrigada!

7 respostas

Olá Márcia,

Existe algum motivo de você estar usando o substring() para isso?

Você poderia usar o indexOf() também, para não usar o RegEx.

Segue um exemplo abaixo com o indexOf()

https://codepen.io/maehana/pen/oKxKzx

Mas ele é CaseSensitive, então para ignorar você teria que mudar um pouco o código de acordo com a sua necessidade.

Espero ter ajudado!

Oi, Luiz!

Obrigada pela sua resposta.

Realmente o indexOf() simplificaria bastante a solução para o problema.

Entretanto utilizei o substring() porque é a proposta do exercício que estou respondendo e gostaria de entender porque não está funcionando como eu esperava.

Abraços!

Entendi,

Então acho que o que falta no seu código é durante o for, verificar se ele já encontrou, pois ele vai percorrer toda a string, e se ele achar, não tem nenhum código informando que já encontrou para ele não precisar procurar mais.

Eu atualizei o link https://codepen.io/maehana/pen/oKxKzx usando o substring para fazer o search

Será que é esse o problema?

A minha dúvida é porque o código funciona perfeitamente se o texto a ser buscado coincide com o início ou o final da palavra.

Como disse, na busca pela paciente de nome Tatiana, se eu procuro pelo texto "Tat" ou "ana" ele encontra e mostra a linha correta, ou seja, o código funciona perfeitamente.

Entretanto, se eu procuro pelo texto "tia", ele encontra o texto dentro de Tatiana (comprovo isso imprimindo uma mensagem na console.log()) mas ele não consegue mostrar a linha relativa a essa paciente.

Se estivesse faltando essa verificação dentro do for, será que estaria funcionando para os casos acima?

Acho que sim, pois no for ele vai percorrer por todo o conteúdo da string Tatiana então se eu escrever t ele vai percorrer pelo T , depois a, t, i, a, n, a, então ele deveria parar de procurar se ele encontrar o t pela primeira vez, pode ser que ele ache mas depois ele continue o for e não encontre e dê como não encontrado, você consegue colocar o código nesse CodePen para podermos ver se é isso mesmo?

Inclui o código do html, css e o javascritp correspondente ao filtrar-tabela.js lá no CodePen.

Entretanto acho que o html não está enxergando o javascript que coloquei na janela... como configurar para funcionar lá no CodePen?

Oi Márcia, se tiver um javascript ou css externo, tipo bootstrap, jquery e etc você pode adicionar no botão de configurações (engrenagem), ele atualiza automáticamente, se tiver alguma coisa errada ele já avisa, e tem o console embaixo também caso precise.