【问题标题】:Apply a filter on a multilevel object based on a different object基于不同对象在多级对象上应用过滤器
【发布时间】:2022-01-04 02:19:05
【问题描述】:

我有一个包含多级对象的数组,例如:

list= [ {  
           type: { name: 'dog', size:'medium'},
           entity: { name: 'Tobby',  age: '7'},
         },
         {  
           type: { name: 'cat', size:'small'},
           entity: { name: 'Garfield',  age: '7'},
         }
    ]

我有一个定义的过滤器,例如:

filter={
         type: { name:'dog'}}

我需要定义一个可以调用的函数

let filtered = list.thisMagicFilter(filter)

这将在我的列表中进行相应的过滤(在给定的示例中,仅返回第一个元素。

逻辑上,如果过滤器是{entity:{age:'7'}},那么两个结果都应该返回。

我试图用list.filter() 在函数式编程中做到这一点,但它对我来说太复杂了:我正在为它是一个 2 级验证这一事实而苦苦挣扎。

我能得到一些关于如何解决这个问题的提示吗?

提前谢谢你!

【问题讨论】:

    标签: javascript filter functional-programming


    【解决方案1】:

    您可以对嵌套对象使用递归过滤器,并手动处理零件文件管理器和零件数据对象,直到不再有嵌套对象为止。

    const
        list = [{ type: { name: 'dog', size: 'medium' }, entity: { name: 'Tobby', age: '7' } }, { type: { name: 'cat', size: 'small' }, entity: { name: 'Garfield', age: '7' } }],
        filter = { type: { name: 'dog' } },
        filterBy = f => o => Object
            .entries(f)
            .every(([k, v]) => typeof v === 'object'
                ? filterBy(v)(o[k])
                : o[k] === v
            ),
        result = list.filter(filterBy(filter));
    
    console.log(result);   
    .as-console-wrapper { max-height: 100% !important; top: 0; }

    【讨论】:

      【解决方案2】:

      试试这个:

      const _matchesFilter = (e, conditions = []) =>
        conditions.every(([prop, condition]) => {
          const subConditions = Object.entries(condition);
          return subConditions.every(([ subProp, subCondition ]) =>
            e[prop]?.[subProp] === subCondition
          );
        });
      
      const thisMagicFilter = (list = [], filter = {}) => {
        const conditions = Object.entries(filter);
        return list.filter(e => _matchesFilter(e, conditions));
      }
      
      const list= [ 
        { type: { name: 'dog', size:'medium'}, entity: { name: 'Tobby',  age: '7'} },
        { type: { name: 'cat', size:'small'}, entity: { name: 'Garfield',  age: '7'} }
      ];
      console.log( thisMagicFilter(list) );
      console.log( thisMagicFilter(list, { type: { name: 'dog'} }) );
      console.log( thisMagicFilter(list, { entity: { age: '7'} }) );
      console.log( thisMagicFilter(list, { entity: { name: 'Garfield', age: '7'} }) );
      console.log( thisMagicFilter(list, { type: { size: 'medium' }, entity: { age: '7'} }) );

      【讨论】:

        猜你喜欢
        • 2020-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-09-24
        • 1970-01-01
        • 2023-03-20
        • 2017-10-27
        • 1970-01-01
        相关资源
        最近更新 更多