2
votes

filtre un tableau d'objets basé sur des clés d'objet distinctes, des valeurs

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.


5 commentaires

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.


3 Réponses :


2
votes

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);


0 commentaires

0
votes

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);


0 commentaires

0
votes

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);


0 commentaires