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

day*_*mer 65 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
        },
Run Code Online (Sandbox Code Playgroud)

当我做

_.filter(summary.data, {'debit': true})
Run Code Online (Sandbox Code Playgroud)

我把所有的物品都拿回来了.

我想要的是?

我希望所有的物体在哪里category.parent == 'Food',我该怎么做?

我试过了

_.filter(summary.data, {'category.parent': 'Food'})
Run Code Online (Sandbox Code Playgroud)

得到了

[]
Run Code Online (Sandbox Code Playgroud)

Akr*_*kos 140

lodash允许嵌套对象定义:

_.filter(summary.data, {category: {parent: 'Food'}});
Run Code Online (Sandbox Code Playgroud)

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

_.filter(summary.data, ['category.parent', 'Food']);
Run Code Online (Sandbox Code Playgroud)

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

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

_.filter(summary.data, {category: [{parent: 'Food'}] }); 
Run Code Online (Sandbox Code Playgroud)

如果你真的需要一些自定义比较,那么何时传递一个函数:

_.filter(summary.data, function(item) {
  return _.includes(otherArray, item.category.parent);
});
Run Code Online (Sandbox Code Playgroud)

  • 如果你需要模糊匹配,那么你应该使用你在答案中所做的功能.由于这个问题不需要那种定制,我认为使用内置函数更好**在这种情况下**. (6认同)
  • 如果嵌套值是一个数组(比如,类别是一个数组),`_.filter(summary.data,{category:[{parent:'Food'}]});`会做的伎俩**(介意父过滤器周围的方括号)** (4认同)

idb*_*old 45

_.filter(summary.data, function(item){
  return item.category.parent === 'Food';
});
Run Code Online (Sandbox Code Playgroud)

  • 虽然这有效,但是当已经有一个内置函数可以执行此操作时,它对于lodash来说有点冗长. (7认同)
  • @Akrikos 那是什么功能? (5认同)
  • @DannyG他的回答就在我的下面。 (3认同)

evi*_*ive 12

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

_.filter(summary.data, 'category.parent', 'Food')
Run Code Online (Sandbox Code Playgroud)

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