Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Parece bem bobinho, mas sou iniciante, por isso me perdoem. Tenho uma lista com três empresas, e queria com um botão filtrar os dados (mostrar as que estão on e as que estão off) e com um outro botão contar quantas estão on e off e mostrar na tela a quantidade). Sei que existem métodos exclusivos do JS, mas queria à princípio, utilizando for.
<button onclick="fil()">Filtrar dados</button>
<p id="botão1"></p>
<button onclick="con()">Contar dados</button>
<p id="botão2"></p>
var dados = [{
"Nome": "EMPRESA1",
"Status": true
}, {
"Nome": "EMPRESA2",
"Status": false
}, {
"Nome": "EMPRESA3",
"Status": true
}];
//filtrar os serviços com status igual ao parametro, NÃO USAR UNDERSCORE
function filtrar(Status) {
return dados.Status = true;
}
function fil() {
document.getElementById("botão1").innerHTML = dados.filter(filtrar);
}
//contar a quantidade de serviços com status igual ao parametro, NÃO USAR UNDERSCORE
function contar(status) {
//for
}
Só complementando o meu amigo @wootzor.
Aqui basicamente temos um array [] de objetos {} em JS:
var dados = [
{
"Nome": "EMPRESA1",
"Status": true
}
,{
"Nome": "EMPRESA2",
"Status": false
}
,{
"Nome": "EMPRESA3",
"Status": true
}
];
O seu objetivo seria simplemente filtrar e exibir apenas as chaves Status cujo o valor é true.
Para percorrer um array em JS temos diversas maneiras (for, forEach, map).
Vou exemplificar com o for in...
for(x in dados){
if(dados[x]['Status']){
//Só vai entrar aqui qnd o Status estiver true
}
}
Ai para filtrar e exibir em tempo real precisa de alguns conhecimentos do JS...
Um exemplo pra ti, tentei deixar o mais simples possível porem dinâmico a ponto de você ver os estados se alternarem
[https://jsfiddle.net/4f5wkvfw/](https://jsfiddle.net/4f5wkvfw/)
Pensando bem você poderia até fazer outros filtros... e intercalando eles.
<!-- Spoiler -->
Acabei viajando na ideia e tentar reproduzir aqueles filtros do Angular 1.x
Da uma olhada no filtro de Nome + Status hehe
[https://jsfiddle.net/h5o9Lfu5/](https://jsfiddle.net/h5o9Lfu5/)Os dois estão interessantes, mas @wootzor, como ficaria para mostrar os status de todas as empresas ao clicar no botão? Nesse exemplo aparece somente uma, e só se for true, caso contrário aparece a próxima.
E @gabrieldarezzo, não teria uma forma mais simples de fazer essa busca pelo nome da empresa?
Acredito que sim @vinitf
Se você observar a maioria da complexidade está em cima do Crossbrowser (Maldito IE), e a intercalação (Pode filtrar ao mesmo tempo status + nome)
Basicamente a unica parte que realmente filtra é essa:
var dadosCopy = dados.slice();
var filterNome = this.value;
if(filterNome != ''){
var i = dadosCopy.length;
while (i--) {
var myRegex = new RegExp(filterNome, 'gi');
if(dadosCopy[i]['Nome'].match(myRegex) == null){
dadosCopy.splice(i, 1); // Remove o elemento
}
}
}
popDados(dadosCopy);
O splice faz uma copia para não perdermos a referencia dos dados originais.
Percorremos todos os elemetos do Array como o while (o motivo do while seria para utilziar dinamicamente o splice)
Efetuamos uma expressão regular, caso não encontre nada ( == null) retiramos aquele objeto do array.
E por fim chamamos uma função para popular o array copiado e filtrado ;)
Talvez exista alguma funções para deixar mais enxuto o código mas eu desconheço.
Live demo do simplificado:
[https://jsfiddle.net/h5o9Lfu5/](https://jsfiddle.net/h5o9Lfu5/)Recomendo fortemente ficar a vontade com as funções do JavaScript.
Recomendo muito a serie:
https://www.youtube.com/playlist?list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc
Ep de arrays:
https://www.youtube.com/watch?v=oUx0leLZSbY&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc&index=9&t=101s
Ep de Expressão Regular:
https://www.youtube.com/watch?v=9r48XuOB4DA&list=PLQCmSnNFVYnT1-oeDOSBnt164802rkegc&index=10
Temos também a opção de 'filtros' em FrameWorks
http://gabrieldarezzo.github.io/be_mean/aula4/
Exemplo do Angular 1x:
<tr data-ng-repeat="user in User.users | orderBy:predicate:reverse | filter:searchUser">
<td data-ng-repeat="(key, value) in user">{{value}}</td>
</tr>
[https://docs.angularjs.org/api/ng/filter/filter](https://docs.angularjs.org/api/ng/filter/filter)Filtrar pelo status não ficaria mais simples que pelo nome?
Foi apenas um exemplo (Algo a mais)
No Post: eu fiz um exemplo apenas de status + Explicações
a demo da filtragem apenas pelo status está aqui:
Agora me exigiram filtrar os dados, mas só retornando, sem precisar imprimir, e usando for. Estou no caminho?
function filtrar(status) {
var a = 0;
var lista = [];
var x = this.length;
for (var i = 0; i < x; i++) {
return lista;
}
if (dados[i].Status === status) {
//???
a += dados[i];
return a;
}
}
Vê se ajuda:
}, { "Nome": "EMPRESA2", "Status": false }, { "Nome": "EMPRESA3", "Status": true }];//filtrar os serviços com status igual ao parametro, NÃO USAR UNDERSCORE
//contar a quantidade de serviços com status igual ao parametro, NÃO USAR UNDERSCORE