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.
3 Réponses :
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) );
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.
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
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