How to filter JSON data with Lodash

2

I have a factory that obtains the data from a WebAPI, it returns all the data, but the filter does not work:

myApp.factory('Canchas', function($http){

var Canchas = {};
Canchas.list = [];

Canchas.getDataFromServer = function getDataFromServer(){
    if(!_.isEmpty(Canchas.list)) return;
    return $http.get('http://localhost:666/api/canchas/getCahchas').then(requestSuccessful, requestUnsuccessful);

    function requestSuccessful(response){
        if(_.isEmpty(response.data)) throw new Error();

        Canchas.list = response.data;
    }

    function requestUnsuccessful(){
        throw new Error();
    }
};

Canchas.getFilterCanchas = function getFilterCanchas(filtro){
  return _.filter(Canchas.list, {'data3':true});
};

return Canchas; });

The Json result has the following format:

[{
    "name": "aaa",
    "data1": true,
    "data2": false,
    "data3": true
},
{
    "name": "bbb",
    "data1": true,
    "data2": false,
    "data3": false
},
{
    "name": "ccc",
    "data1": true,
    "data2": true,
    "data3": true
}]

From a controller I generate a "filter" to pass it to the factory and I want to get the value of "aaa" and "ccc" when data1 and data3 are true. I've tried with _.filter and _.find but I can not get the results

myApp.controller('geoCtrl', function($scope, Canchas){

var filtro = [];

$scope.filtrodata = function(){
    filtro = _.uniqWith(filtro, _.isEqual);
    var pusher;

    if($scope.j1===true){
        $scope.insertardata({'data1':true});
    }else{
        $scope.borrardata({'data1':true});
    }

    if($scope.j2===true){
        $scope.insertardata({'data2':true});
    }else{
        $scope.borrardata({'data2':true});
    }

    if($scope.j3===true){
        $scope.insertardata({'data3':true});
    }else{
        $scope.borrardata({'data3':true});
    }

    filtro = _.uniqWith(filtro, _.isEqual);

    $scope.detalle = Canchas.getFilterCanchas(filtro);
}

$scope.insertardata = function(objeto){
    pusher = _(filtro).push(objeto);
    pusher = pusher.commit();
}

$scope.borrardata = function(objeto){
    if(_.some(filtro, objeto)) {
        _.remove(filtro, objeto);
    }
}});
    
asked by Gabriel Sule 04.03.2016 в 18:41
source

1 answer

0

The syntax of filter is as follows:

_.filter(arreglo, { "condicion": "valor" });

You can modify your function like this: (Assuming you already received the result in Canchas.list )

$scope.filtrodata = function(){
    var reglasFiltro = {};

    // preparas cada campo del filtro
    // los ifs no son necesarios en este caso, los removí
    reglasFiltro['data1'] = $scope.j1 === true;
    reglasFiltro['data2'] = $scope.j2 === true;
    reglasFiltro['data3'] = $scope.j3 === true;

    // obtienes todos los datos y filtras con las reglas preparadas...
    var detalles = _.filter(Canchas.list, reglasFiltro);

    // propagas a la UI
    $scope.detalle = detalles;
}

Here is an example, just LoDash:

var datos = [{
    "name": "aaa",
    "data1": true,
    "data2": false,
    "data3": true
},
{
    "name": "bbb",
    "data1": true,
    "data2": false,
    "data3": false
},
{
    "name": "ccc",
    "data1": true,
    "data2": true,
    "data3": true
}];

var resultado = _.filter(datos, { "data1": true, "data3": true });

console.log(resultado);
<script src="https://cdnjs.cloudflare.com/ajax/libs/lodash.js/4.6.1/lodash.js"></script>
    
answered by 04.03.2016 / 19:17
source