web-dev-qa-db-ja.com

Lodash:Objectをネストしているときにフィルターを使用するにはどうすればよいですか?

この例を考えてみましょう。 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
        },

私がする時

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

すべてのオブジェクトを取得します。

私が欲しいものは?

category.parent == 'Food'のすべてのオブジェクトが必要ですが、どうすればよいですか?

私は試した

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

そして得た

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

lodashは、ネストされたオブジェクト定義を許可します。

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

V3.7.0の時点で、lodashでは文字列でオブジェクトキーを指定することもできます。

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

JSFiddleのコード例: https://jsfiddle.net/6qLze9ub/

lodashは、配列を使用したネストもサポートしています。配列項目の1つでフィルタリングする場合(たとえば、カテゴリが配列の場合):

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

カスタム比較が本当に必要な場合は、関数を渡す必要があります。

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

v3.7.0から始めて、次の方法でそれを行うことができます。

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

トリックもやるべき

3
Denis

Lodash 4.xでは、次のことを行う必要があります。

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

(2番目の引数を囲む配列に注意してください)。

これは次の呼び出しと同等です。

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

ここに_.matchesPropertyのドキュメントがあります

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