it-swarm.com.de

Lodash: Wie verwende ich Filter, wenn ich ein verschachteltes Objekt habe?

Betrachten Sie dieses Beispiel. Ich benutze Lodash

 'data': [
        {
            'category': {
                'uri': '/categories/0b092e7c-4d2c-4eba-8c4e-80937c9e483d',
                'parent': 'Food',
                'name': 'Costco'
            },
            'amount': '15.0',
            'debit': true
        },
        {
            'category': {
                'uri': '/categories/d6c10cd2-e285-4829-ad8d-c1dc1fdeea2e',
                'parent': 'Food',
                'name': 'India Bazaar'
            },
            'amount': '10.0',
            'debit': true
        },
        {
            'category': {
                'uri': '/categories/d6c10cd2-e285-4829-ad8d-c1dc1fdeea2e',
                'parent': 'Food',
                'name': 'Sprouts'
            },
            'amount': '11.1',
            'debit': true
        },

Wenn ich es tue

_.filter(summary.data, {'debit': true})

Ich hole alle Gegenstände zurück.

was ich will?

Ich möchte alle Objekte, in denen category.parent == 'Food', wie kann ich das machen?

Ich habe es versucht

_.filter(summary.data, {'category.parent': 'Food'})

und bekam

[]
64
daydreamer
_.filter(summary.data, function(item){
  return item.category.parent === 'Food';
});
44
idbehold

lodash erlaubt verschachtelte Objektdefinitionen:

_.filter(summary.data, {category: {parent: 'Food'}});

Ab Version 3.7.0 ermöglicht lodash auch die Angabe von Objektschlüsseln in Zeichenfolgen:

_.filter(summary.data, ['category.parent', 'Food']);

Beispielcode in JSFiddle: https://jsfiddle.net/6qLze9ub/

lodash unterstützt auch das Verschachteln mit Arrays. Wenn Sie nach einem der Array-Elemente filtern möchten (zum Beispiel, wenn category ein Array ist):

_.filter(summary.data, {category: [{parent: 'Food'}] }); 

Wenn Sie wirklich einen benutzerdefinierten Vergleich benötigen, müssen Sie eine Funktion übergeben:

_.filter(summary.data, function(item) {
  return _.includes(otherArray, item.category.parent);
});
137
Akrikos

beginnend mit v3.7.0 Sie können es auf diese Weise tun:

_.filter(summary.data, 'category.parent', 'Food')
12
evilive
_.where(summary.data, {category: {parent: 'Food'}});

Sollte auch den Trick machen

3
Denis

In lodash 4.x müssen Sie Folgendes tun:

_.filter(summary.data, ['category.parent', 'Food'])

(Beachten Sie das Array um das zweite Argument).

Dies entspricht dem Aufruf von:

_.filter(summary.data, _.matchesProperty('category.parent', 'Food'))

Hier sind die Dokumente für _.matchesProperty :

// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']
2
iamyojimbo