Multiple filters on a json object?

0

Hello.

I have 10 filters for a single json object:

var filtro1 = function(value, selecionado){
    var data = JSON.parse(JSON.stringify(json.aPesquisa));
    var result = data.filter(function(pesquisa){
        ...
    });
    return result;
}

var filtro2 = function(value, selecionado){
    var data = JSON.parse(JSON.stringify(json.aPesquisa));
    var result = data.filter(function(pesquisa){
        ...
    });
    return result;
}

var filtro3 = function(horamin, horamax){
    var data = JSON.parse(JSON.stringify(json.aPesquisa));
    var result = data.filter(function(pesquisa){
        ...
    });
    return result;
}

var filtro4 = function(value, selecionado){
    var data = JSON.parse(JSON.stringify(json.aPesquisa));
    var result = data.filter(function(pesquisa){
        ...
    });
    return result;
}
...

And so on. As you can see each filter works separately ie if I filter with filter1 and then filter2 it only displays filter2.

Would there be any way I could put these filters together?

I thought about using an array with the filters selected:

var filtros = ["filtro1, "filtro2", "filtro6", "filtro9", "filtro10"];

But I could not.

The idea and interlink the filters.

    
asked by anonymous 24.07.2017 / 23:53

1 answer

1

First, you can structure your filters within a "Class".

var Filtro = function () {
    this.data = JSON.parse(JSON.stringify(json.aPesquisa));
}

Filtro.prototype.filtro1 = function(value, selecionado){
    this.data = this.data.filter(function(pesquisa){
        ...
    });
    return this;
}

Filtro.prototype.filtro2 = function(value, selecionado){
    this.data = this.data.filter(function(pesquisa){
        ...
    });
    return this;
}

Filtro.prototype.filtro3 = function(horamin, horamax){
    this.data = this.data.filter(function(pesquisa){
        ...
    });
    return this;
}

Filtro.prototype.filtro4 = function(value, selecionado){
    this.data = this.data.filter(function(pesquisa){
        ...
    });
    return this;
}

...

Filtro.prototype.GetResult = function() {
    return this.data;
}

You can call it as follows.:

var result = new Filtro()
    .filtro1(value1, selected1)
    .filtro2(value2, selected2)
    .filtro6(horamin, horamax) 
    .filtro9(value9, selected9) 
    .filtro9(value10, selected10) 
    .GetResult();

or as follows:

var filtros = [
    { name: "filtro1", params: [ value1, selected1 ] }, 
    { name: "filtro2", params: [ value2, selected2 ] }, 
    { name: "filtro6", params: [ horamin, horamax ] }, 
    { name: "filtro9", params: [ value9, selected9 ] },  
    { name: "filtro10", params: [ value10, selected10 ] }
]; 
var result = filtros.reduce(function (wrapper, filtro) {
    return wrapper[filtro.name].call(wrapper, filtro.params);
}, new Filtro()).GetResult();

Following is an implementation with the same principle.

var Filtro = function () {
  this.filtros = [];
}

Filtro.prototype.filtro1 = function(value, selecionado){
  this.filtros.push({ 
    filtro: "filtro1", 
    params: {  
      value: value, 
      selecionado: selecionado
    } 
  });
  return this;
}

Filtro.prototype.filtro2 = function(value, selecionado){
  this.filtros.push({ 
    filtro: "filtro2", 
    params: {  
      value: value, 
      selecionado: selecionado
    } 
  });
  return this;
}

Filtro.prototype.filtro6 = function(horamin, horamax){
  this.filtros.push({ 
    filtro: "filtro6", 
    params: {  
      horamin: horamin, 
      horamax: horamax
    } 
  });
  return this;
}

Filtro.prototype.filtro9 = function(value, selecionado){
  this.filtros.push({ 
    filtro: "filtro9", 
    params: {  
      value: value, 
      selecionado: selecionado
    } 
  });
  return this;
}

Filtro.prototype.GetResult = function(){
  return this.filtros;
}

var result = new Filtro()
  .filtro1("value 01", "selecionado 01")
  .filtro2("value 02", "selecionado 02")
  .filtro6("horamin 06", "horamax 06") 
  .filtro9("value 09", "selecionado 09") 
  .GetResult();
console.log(result);
    
26.07.2017 / 16:02