1
votes

Filtrer les données imbriquées avec des valeurs de tableau à l'aide de lodash react js

Prenons cet exemple. J'utilise Lodash

var filterplaces = _.filter(data.places,{ location: [{ location_id: this.state.selectedLocationId}] });

Je souhaite filtrer le au-dessus des données avec location_id s'il n'y a qu'un seul identifiant pour filtrer avec alors

"data": {
    “places”: [
                {
            place: 1,
            place name: ‘123’
            location: [ 
                {
                    location_id: 1,
                    location_name: ‘xyz’
                },
                {
                    location_id: 2,
                    location_name: ‘abc’
                },
                {
                    location_id: 3,
                    location_name: ‘etc’
                },
            ]
        }, 
        {
            place: 2,
            place name: ‘456’
            location: [ 
                {
                    location_id: 1,
                    location_name: ‘xyz’
                },
                {
                    location_id: 3,
                    location_name: ‘abc’
                },
                {
                    location_id: 4,
                    location_name: ‘etc’
                },
            ]
        } ,
        {
            place: 3,
            place name: ‘123’
            location: [ 
                {
                    location_id: 5,
                    location_name: ‘xyz’
                },
                {
                    location_id: 6,
                    location_name: ‘abc’
                },
                {
                    location_id: 2,
                    location_name: ‘etc’
                },
            ]
        }
  ]
}

il renvoie les données de filtre appropriées. Sachez que le problème est lorsqu'il y a plus d'un location_id, alors comment dois-je transmettre les données du tableau pour filtrer les enregistrements. disons que selectedLocationId sera un tableau qui a locationid [2,5].

Toute aide est appréciée Merci d'avance.


0 commentaires

3 Réponses :


2
votes

Vous pouvez le faire sans lodash:

filteredPlaces = data.places.filter(element => element.location.some((obj => required_ids.indexOf(obj.location_id) > -1)));

var data = {
  "places": [{
      place: 1,
      place_name: "123",
      location: [{
          location_id: 1,
          location_name: "xyz"
        },
        {
          location_id: 2,
          location_name: "abc"
        },
        {
          location_id: 3,
          location_name: "etc"
        },
      ]
    },
    {
      place: 2,
      place_name: "456",
      location: [{
          location_id: 1,
          location_name: "xyz"
        },
        {
          location_id: 3,
          location_name: "abc"
        },
        {
          location_id: 4,
          location_name: "etc"
        },
      ]
    },
    {
      place: 3,
      place_name: "123",
      location: [{
          location_id: 5,
          location_name: "xyz"
        },
        {
          location_id: 6,
          location_name: "abc"
        },
        {
          location_id: 2,
          location_name: "etc"
        },
      ]
    }
  ]
};

let required_ids = [1, 2];
var filterplaces = [];
data.places.forEach(element => element.location.filter(obj => required_ids.indexOf(obj.location_id) > -1).length && filterplaces.push(element));

console.log(filterplaces);

Cela pourrait également être fait en utilisant some():

data.places.forEach(element => 
     element.location.filter(obj => required_ids.indexOf(obj.location_id) > -1).length
     && filterplaces.push(element)
);


2 commentaires

shrys son emplacement correspondant de retour je veux un objet de lieux complet qui contient les identifiants d'emplacement requis.


const filteredPlaces = data.places.filter (element => element.location.some (/ * * /)); serait plus efficace et plus clair.



1
votes

vous pouvez utiliser une fonction comme prédicat au lieu d'une itération abrégée :

var filterplaces = _.filter(data.places, function(place) {
  return this.state.selectedLocationIds.indexOf(place.location.location_id) >= 0;
});

J'espère que cela vous aidera


0 commentaires

0
votes

Itère sur les éléments de la collection, renvoyant un tableau de tous les éléments prédicat renvoie la vérité pour. Le prédicat est appelé avec trois arguments: (valeur, index | clé, collection). Remarque: contrairement à _.remove, cette méthode renvoie un nouveau tableau.

var filter = _.filter(data.places, function(p) {
  if (p.length === 1) {
// write logic to return true or not if locaion is onnly 1
} else {
// write logic for more than 1 location id 
}
});

https://lodash.com/docs/#filter pour plus de détails


0 commentaires