J'ai le tableau de personnes ci-dessous:
const NEW_ARRAY = [ { name: 'Simon', age: 32, occupation: 'Student' } ];
Je voudrais filtrer le tableau pour produire un tableau séparé basé sur un objet 'filters'.
Pour exemple si mes filtres sont:
const FILTERS = { age: 32, name: 'Simon', occupation: '' }
Le nouveau tableau doit être vide car aucune personne dans le tableau n'a la combinaison de 32 et John. Toutefois, si mes filtres sont:
const FILTERS = { age: 32, name: 'John', occupation: '' };
Le nouveau tableau de personnes renvoyé sera:
const FIRST_ARRAY = [ { name: 'Simon', age: 32, occupation: 'Student' }, { name: 'Vera', age: 22, occupation: 'Developer' } ];
Comment puis-je filtrer le tableau de personnes en itérant sur les valeurs d'objet «filtres»? Gardez à l'esprit que les clés et les valeurs des filtres changeront dynamiquement tout le temps.
3 Réponses :
Vous pouvez filtrer comme suit:
const FIRST_ARRAY = [ { name: 'Simon', age: 32, occupation: 'Student' }, { name: 'Vera', age: 22, occupation: 'Developer' } ]; const FILTERS = { name: 'Simon', age: 32, occupation: '' }; const filtered = FIRST_ARRAY.filter(person => Object.entries(FILTERS) .every(([key, val]) => val !== '' ? person[key] === val : true)); console.log(filtered);
Vous pouvez utiliser la fonction filter
et la fonction every
pour vérifier que chaque valeur-clé est égale aux valeurs de FILTERS
.
En supposant que dans les FILTRES, une valeur est vide, sautez-la
const FILTERS = { age: 32, name: 'John', occupation: '' };
.as-console-wrapper { max-height: 100% !important; top: 0; }
const FIRST_ARRAY = [{name: 'Simon',age: 32,occupation: 'Student'},{name: 'Vera',age: 22,occupation: 'Developer'}], FILTERS = {age: 32,name: 'Simon',occupation: ''}, keys = Object.keys(FILTERS), result = FIRST_ARRAY.filter(o => keys.every(k => FILTERS[k] === '' || FILTERS[k] === o[k])); console.log(result);
Vous pouvez essayer quelque chose comme:
function compare(item, filter) { for (var property in filter) { if (filter.hasOwnProperty(property)) { let value = filter[property]; return item.hasOwnProperty(property) && item[property] != '' && value == item[property]; } } } const DATA = [ { name: 'Simon', age: 32, occupation: 'Student' }, { name: 'Vera', age: 22, occupation: 'Developer' } ]; const filter = { age: 32, name: 'Simon', occupation: '' }; let result = DATA.filter(function(item) { return compare(item, filter); }) console.log(result);
Vous n'avez posé aucune question.
occupation: ''
est trompeur en tant que valeur de filtre. Omettre une propriété serait un peu plus logique.Une
occupation
est-elle nécessaire comme filtre?n'est-ce pas une recherche / filtre normal? comme Filter_Array.where (f => (f.age == age || isnullorEmpty (age)) && (f.name == name || isnullorEmpty (name)) && (c.occupation == occupation || isnullorEmpty (occupation ))); Modifier en javascript mais la logique doit être similaire
L'occupation peut être omise si la chaîne est vide. Cependant, il existera dans l'objet filters.