Подтвердить что ты не робот

Lodash: как использовать фильтр, когда у меня есть вложенный объект?

Рассмотрим этот пример. Я использую 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'})

и получил

[]
4b9b3361

Ответ 1

_.filter(summary.data, function(item){
  return item.category.parent === 'Food';
});

Ответ 2

lodash позволяет определять вложенные объекты:

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

Начиная с версии v3.7.0, lodash также позволяет указывать ключи объектов в строках:

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

Пример кода в JSFiddle: https://jsfiddle.net/6qLze9ub/

lodash также поддерживает вложенность массивами; если вы хотите фильтровать один из элементов массива (например, если категория представляет собой массив):

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

Если вам действительно нужно какое-то выборочное сравнение, то когда передать функцию:

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

Ответ 3

начиная с v3.7.0, вы можете сделать это следующим образом:

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

Ответ 4

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

Должен также делать трюк

Ответ 5

В lodash 4.x вам нужно сделать:

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

(обратите внимание, что массив обертывает второй аргумент).

Это эквивалентно вызову:

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

Вот документы для _.matchesProperty:

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