Lodash:嵌套对象后如何使用过滤器?


70

考虑这个例子。我正在使用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'})

并得到

[]

Answers:


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

8
尽管这可行,但对于已经存在内置函数的lodash来说,lodash有点冗长。
Akrikos

4
@Akrikos,那是什么功能?
Danny22'1/

154

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

我实际上不知道这是可能的,很好的发现。尽管这肯定更简单,但它也很局限,因为它阻止您进行任何类型的模糊匹配。可以说,我只是想在那里的项目category.parent 等于'Food'?或者,如果我想将其与category.parent不区分大小写的匹配'Food'?使用这种方法,这两个例子都是不可能的。
idbehold 2014年

6
如果需要模糊匹配,则应使用与答案相同的函数。由于此问题不需要这种定制,因此我认为在这种情况下使用内置函数会更好。
Akrikos

4
如果嵌套值是一个数组(例如,category是一个数组),_.filter(summary.data, {category: [{parent: 'Food'}] });则可以解决问题(注意父过滤器周围的方括号)
manikanta

1
如今看来(今天的版本是4.17.2),第二个解决方案需要一个数组作为第二个参数:_.filter(summary.data, ['category.parent', 'Food']); 如果没有数组,它将仅检查属性是否存在,但不与给定值进行比较。
Arjan

1
FYI在v4中,_。contains包含不再存在。这是_.includes被删除的别名。
glyph'2

12

v3.7.0您开始就可以用这种方式做到这一点:

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

4
如今看来(今天的版本是4.17.2),这需要一个数组作为第二个参数:_.filter(summary.data, ['category.parent', 'Food']); 如果没有数组,它只会检查属性是否存在,但不会与给定值进行比较。
Arjan


3

在lodash 4.x中,您需要执行以下操作:

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

(请注意第二个参数周围的数组)。

这等效于调用:

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

以下是docs_.matchesProperty

// The `_.matchesProperty` iteratee shorthand.
_.filter(users, ['active', false]);
// => objects for ['fred']
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.