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'}]
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; }
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);
}
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.
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);
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;
});
}
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');
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');