web-dev-qa-db-fra.com

Filtrer un tableau d'objets dont les propriétés contiennent une valeur

Je me demande quel est le moyen le plus propre, le meilleur moyen de filtrer un tableau d'objets en fonction d'un string keyword. La recherche doit être faite dans toutes les propriétés de l'objet.

Lorsque je tape lea, je souhaite parcourir tous les objets et toutes leurs propriétés pour renvoyer les objets contenant lea.

Lorsque je tape italy, je souhaite parcourir tous les objets et toutes leurs propriétés pour renvoyer les objets contenant italy.

Je sais qu'il existe de nombreuses solutions, mais je n’en ai vu que pour lesquelles vous devez spécifier la propriété que vous souhaitez associer.

ES6 et lodash sont les bienvenus!

  const arrayOfObject = [{
      name: 'Paul',
      country: 'Canada',
    }, {
      name: 'Lea',
      country: 'Italy',
    }, {
      name: 'John',
      country: 'Italy',
    }, ];

    filterByValue(arrayOfObject, 'lea')   // => [{name: 'Lea',country: 'Italy'}]
    filterByValue(arrayOfObject, 'ita')   // => [{name: 'Lea',country: 'Italy'}, {name: 'John',country: 'Italy'}]

5
Léo Coco

Vous pouvez le filtrer et rechercher uniquement une occurrence de la chaîne de recherche.

Méthodes utilisées:

  • Array#filter , juste pour filtrer un tableau avec des conditions,

  • Object.keys pour obtenir tous les noms de propriétés de l'objet,

  • Array#some pour itérer les clés et sortir de la boucle, le cas échéant,

  • String#toLowerCase pour obtenir des valeurs comparables,

  • String#includes pour vérifier deux chaînes, si l'une contient l'autre.

function filterByValue(array, string) {
    return array.filter(o =>
        Object.keys(o).some(k => o[k].toLowerCase().includes(string.toLowerCase())));
}

const arrayOfObject = [{ name: 'Paul', country: 'Canada', }, { name: 'Lea', country: 'Italy', }, { name: 'John', country: 'Italy' }];

console.log(filterByValue(arrayOfObject, 'lea')); // [{name: 'Lea', country: 'Italy'}]
console.log(filterByValue(arrayOfObject, 'ita')); // [{name: 'Lea', country: 'Italy'}, {name: 'John', country: 'Italy'}]
.as-console-wrapper { max-height: 100% !important; top: 0; }

17
Nina Scholz

Eh bien, quand nous savons déjà que ce ne sera pas une recherche sur un objet avec des méthodes, nous pouvons faire ce qui suit pour économiser un peu de temps:

function filterByValue(array, value) {
  return array.filter((data) =>  JSON.stringify(data).toLowerCase().indexOf(value.toLowerCase()) !== -1);
}
3
binariedMe

Utilisez Object.keys pour parcourir les propriétés de l'objet. Utilisez réduire et filtrer pour rendre le code plus efficace:

 const results = arrayOfObject.filter((obj)=>{
     return Object.keys(obj).reduce((acc, curr)=>{
           return acc || obj[curr].toLowerCase().includes(term);
     }, false);
}); 

Où terme est votre terme de recherche.

3

Vous pouvez toujours utiliser array.filter(), puis parcourir en boucle chaque objet et si l'une des valeurs correspond à la valeur recherchée, renvoyez cet objet.

const arrayOfObject = [{
      name: 'Paul',
      country: 'Canada',
    }, {
      name: 'Lea',
      country: 'Italy',
    }, {
      name: 'John',
      country: 'Italy',
    }, ];
    
let lea = arrayOfObject.filter(function(obj){
  //loop through each object
  for(key in obj){
    //check if object value contains value you are looking for
    if(obj[key].includes('Lea')){
      //add this object to the filtered array
      return obj;
      }
     }
    });
      
console.log(lea);

1
Josan Iracheta

function filterByValue(arrayOfObject,words){
  let reg = new RegExp(words,'i');
  return arrayOfObject.filter((item)=>{
     let flag = false;
     for(prop in item){
       if(reg.test(prop)){
          flag = true;
       }  
     }
     return flag;
  });
}

0
Kermit

Voici comment je le ferais avec lodash:

const filterByValue = (coll, value) =>
  _.filter(coll, _.flow(
    _.values,
    _.partialRight(_.some, _.method('match', new RegExp(value, 'i')))
  ));

filterByValue(arrayOfObject, 'lea');
filterByValue(arrayOfObject, 'ita');
0
Adam Boduch

Une façon serait d'utiliser Array#filter, String#toLowerCase et String#indexOf comme ci-dessous.

const arrayOfObject = [{
            name: 'Paul',
            country: 'Canada',
        }, {
            name: 'Lea',
            country: 'Italy',
        }, {
            name: 'John',
            country: 'Italy',
        }];

        function filterByValue(arrayOfObject, term) {
            var ans = arrayOfObject.filter(function(v,i) {
                if(v.name.toLowerCase().indexOf(term) >=0 || v.country.toLowerCase().indexOf(term) >=0) {
                    return true;
                } else false;
            });
            console.log( ans);
        }
        filterByValue(arrayOfObject, 'ita');

0
Pankaj Shukla