javascript - 基于不同对象在多级对象上应用过滤器

标签 javascript filter functional-programming

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

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 级验证这一事实而苦苦挣扎。
我能得到一些关于如何解决这个问题的提示吗?
先感谢您!

最佳答案

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

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

关于javascript - 基于不同对象在多级对象上应用过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70117321/

相关文章:

JavaScript 拒绝工作?

javascript - 动态 iframe 高度

javascript - React Router 中的查询参数

javascript - 过滤内容 (jQuery)

javascript - 每次导航到AngularJS中的其他 View /页面时如何检查位置路径

filter - elasticsearch - 将嵌套字段与文档中的另一个字段进行比较

javascript - jQuery.filter() : exit before the end

functional-programming - 任意曲线的递归弧长重新参数化

java - 流和功能接口(interface): throw exception inside stream and aggregate them

Scala - 领域对象建模