2016-08-04 35 views
2

Lassen Sie uns sagen, dass ich ein Array von Objekten wie dieses:Wie filtere ich ein Array von Objekten nach Schlüsselwort mit LoDash?

[{ 
    away: "Seattle Seahawks", 
    home: "Kansas City Chiefs", 
}, 
{ 
    away: "Houston Texans", 
    home: "San Francisco 49ers", 
}, 
{ 
    away: "Dallas Cowboys", 
    home: "Los Angeles Rams", 
}] 

Anforderungen:

jedes Objekt Suche nach dem Stichwort 49er und haben es 2 Objekt # zurückzukehren.

Suchen Sie jedes Objekt nach dem Schlüsselwort cow und lassen Sie Objekt # 3 zurückgeben.

Suchen Sie jedes Objekt nach dem Schlüsselwort an und lassen Sie alle drei Objekte zurückgeben.

Was wäre der beste Weg, dies in lodash zu erreichen? Vielen Dank!

Antwort

3

Meine Lösung mit _.flow:

const my_arr = [{ 
    away: "Seattle Seahawks", 
    home: "Kansas City Chiefs", 
}, 
{ 
    away: "Houston Texans", 
    home: "San Francisco 49ers", 
}, 
{ 
    away: "Dallas Cowboys", 
    home: "Los Angeles Rams", 
}] 

function flowFilter(array, substr) { 
    return _.filter(array, _.flow(
    _.identity, 
    _.values, 
    _.join, 
    _.toLower, 
    _.partialRight(_.includes, substr) 
)); 
} 

const one = flowFilter(my_arr, '49er'); 
const two = flowFilter(my_arr, 'cow'); 
const three = flowFilter(my_arr, 'an'); 

console.log('one', one); 
console.log('two', two); 
console.log('three', three); 

https://jsfiddle.net/1321mzjw/

2

Keine Notwendigkeit der Lodash-Bibliothek verwenden native JavaScript-Methoden.

var data = [{ 
 
    away: "Seattle Seahawks", 
 
    home: "Kansas City Chiefs", 
 
}, { 
 
    away: "Houston Texans", 
 
    home: "San Francisco 49ers", 
 
}, { 
 
    away: "Dallas Cowboys", 
 
    home: "Los Angeles Rams", 
 
}]; 
 

 
console.log(
 
    // filter the array 
 
    data.filter(function(v) { 
 
    // get all keys of the object 
 
    return Object.keys(v) 
 
    // iterate and check for any object property value cotains the string 
 
    .some(function(k) { 
 
     // convert to lowercase(to make it case insensitive) and check match 
 
     return v[k].toLowerCase().indexOf('49ers') > -1; 
 
    }) 
 
    }) 
 
); 
 

 
console.log(
 
    data.filter(function(v) { 
 
    return Object.keys(v).some(function(k) { 
 
     return v[k].toLowerCase().indexOf('an') > -1; 
 
    }) 
 
    }) 
 
);

0

Sie können auch schlicht Javascript verwenden.

const my_arr = [{ 
    away: "Seattle Seahawks", 
    home: "Kansas City Chiefs", 
}, 
{ 
    away: "Houston Texans", 
    home: "San Francisco 49ers", 
}, 
{ 
    away: "Dallas Cowboys", 
    home: "Los Angeles Rams", 
}] 



const filterByText = (arr, text) => { 
    return arr.filter((item) => (
    !(
     item.away.toLowerCase().indexOf(text) === -1 && 
     item.home.toLowerCase().indexOf(text) === -1 
    ) 
) 
)} 

console.log(filterByText(my_arr, '49er')) // #2 
console.log(filterByText(my_arr, 'cow')) // #3 
console.log(filterByText(my_arr, 'an')) // #1, #2, #3 

Verwendung von Lodash in diesem Fall wäre fast ähnlich, weil Sie toLoverCase verwendet werden müssen.

const filterByText = (arr, text) => { 

    return _.filter(arr, (obj) => { 
    return Object.keys(obj).some((key) => 
     return obj[key].toLowerCase().indexOf(text) !== -1; 
    ) 
    } 

)} 
0

die kürzeste ich denken kann, ist

// lodash 
data.filter(d => _.some(d, t => /cow/i.test(t))) 

// plain js 
data.filter(d => Object.keys(d).some(k => /cow/i.test(d[k]))) 
0

ich reguläre Ausdrücke mit lodash Funktionen kombinieren möchten. Dieses Szenario ist anwendbar. Erstellen Sie eine generische Funktion, die eine Sammlung und eine RegExp akzeptiert suchen mit:

function myFilter(coll, regex) { 
    return _.filter(
    coll, 
    _.unary(_.partialRight(_.some, _.method('match', regex))) 
); 
} 

Jetzt können Sie was regulären Ausdruck Sie myFilter() wollen passieren, und es wird getestet gegen alle Eigenschaftswerte der einzelnen Objekte in coll. Hier ist, wie es zu benutzen:

myFilter(data, /49er/); 
// ➜ [ 
//  { 
//  away: "Houston Texans", 
//  home: "San Francisco 49ers", 
//  } 
// ] 

myFilter(data, /cow/i); 
// ➜ [ 
//  { 
//  away: "Dallas Cowboys", 
//  home: "Los Angeles Rams", 
//  } 
// ] 

myFilter(data, /an/); 
// ➜ [ 
//  { 
//  away: "Seattle Seahawks", 
//  home: "Kansas City Chiefs", 
//  }, 
//  { 
//  away: "Houston Texans", 
//  home: "San Francisco 49ers", 
//  }, 
//  { 
//  away: "Dallas Cowboys", 
//  home: "Los Angeles Rams", 
//  } 
// ] 

Hier ist eine Zusammenfassung der lodash Funktionen:

  • filter(): Filtert eine Sammlung von einem Prädikat Funktion für jedes Element zu bewerten.
  • unary(): Lässt eine Funktion nur das erste Argument akzeptieren und ignoriert alle anderen.
  • partialRight(): Partial wendet Funktionsargumente von rechts an. Wenn die resultierende Funktion mit mehr Argumenten aufgerufen wird, gehen sie nach links.
  • some(): True, wenn eines der Elemente in der Auflistung für das angegebene Prädikat als wahr ausgewertet wird.
  • method(): Ruft den Methodennamen für ein bestimmtes Objektargument auf. Akzeptiert auch Argumente für die teilweise Anwendung.