Lodash:当我嵌套Object时如何使用过滤器?

时间:2013-06-13 21:00:09

标签: javascript 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'})

得到了

[]

5 个答案:

答案 0 :(得分:133)

lodash允许嵌套对象定义:

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

从v3.7.0开始,lodash还允许在字符串中指定对象键:

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

JSFiddle中的示例代码:https://jsfiddle.net/6qLze9ub/

lodash还支持使用数组进行嵌套;如果要过滤其中一个数组项(例如,如果category是数组):

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

如果你真的需要一些自定义比较,那就是传递函数的时间:

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

答案 1 :(得分:43)

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

答案 2 :(得分:12)

v3.7.0开始,你可以这样做:

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

答案 3 :(得分:3)

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

也应该做的伎俩

答案 4 :(得分:2)

在lodash 4.x中,你需要这样做:

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

(注意数组环绕第二个参数)。

这相当于调用:

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

Here are the docs for _.matchesProperty

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