Ich frage mich, was der sauberste Weg ist, einen Array von Objekten in Abhängigkeit von einem string keyword
zu filtern. Die Suche muss in beliebigen Eigenschaften des Objekts erfolgen.
Wenn ich lea
eingebe, möchte ich alle Objekte und alle ihre Eigenschaften durchgehen, um die Objekte zurückzugeben, die lea
enthalten.
Wenn ich italy
eingebe, möchte ich alle Objekte und alle ihre Eigenschaften durchgehen, um die Objekte zurückzugeben, die italy
enthalten.
Ich weiß, es gibt viele Lösungen, aber bis jetzt habe ich nur einige gesehen, für die Sie die Eigenschaft angeben müssen, die Sie zuordnen möchten.
ES6
und lodash
sind willkommen!
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'}]
Sie könnten es filtern und nur nach einem Vorkommen der Suchzeichenfolge suchen.
Methoden verwendet:
Array#filter
, nur zum Filtern eines Arrays mit Bedingungen,
Object.keys
zum Abrufen aller Eigenschaftsnamen des Objekts,
Array#some
für das Durchlaufen der Tasten und der Exit-Schleife, falls gefunden,
String#toLowerCase
um vergleichbare Werte zu erhalten,
String#includes
zum Überprüfen von zwei Zeichenketten, wenn eine die andere enthält.
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; }
Wenn wir bereits wissen, dass es sich nicht um eine Suche nach einem Objekt mit Methoden handelt, können wir Folgendes tun, um Zeitaufwand zu sparen:
function filterByValue(array, value) {
return array.filter((data) => JSON.stringify(data).toLowerCase().indexOf(value.toLowerCase()) !== -1);
}
Verwenden Sie Object.keys, um die Eigenschaften des Objekts zu durchlaufen. Verwenden Sie den Befehl zum Reduzieren und Filtern, um den Code effizienter zu gestalten:
const results = arrayOfObject.filter((obj)=>{
return Object.keys(obj).reduce((acc, curr)=>{
return acc || obj[curr].toLowerCase().includes(term);
}, false);
});
Wo ist Begriff Ihr Suchbegriff?.
Sie können immer array.filter()
verwenden und dann jedes Objekt durchlaufen. Wenn einer der Werte mit dem gesuchten Wert übereinstimmt, geben Sie dieses Objekt zurück.
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;
});
}
So mache ich es mit lodash:
const filterByValue = (coll, value) =>
_.filter(coll, _.flow(
_.values,
_.partialRight(_.some, _.method('match', new RegExp(value, 'i')))
));
filterByValue(arrayOfObject, 'lea');
filterByValue(arrayOfObject, 'ita');
Eine Möglichkeit wäre, Array#filter
, String#toLowerCase
und String#indexOf
wie folgt zu verwenden.
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');