webentwicklung-frage-antwort-db.com.de

Filterarray eines Objekts, dessen Eigenschaften einen Wert enthalten

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'}]

5
Léo Coco

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

17
Nina Scholz

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);
}
3
binariedMe

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?.

3

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

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

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');
0
Adam Boduch

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

0
Pankaj Shukla