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


и получил



[]
493   5  

5 ответов:

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

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

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

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

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

в лодашь 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']

Comments

    Ничего не найдено.