我正在使用一个名为Body Builder的查询构建器
我需要构建器根据所选过滤器的数量进行工作。
因此,特定列表类型的默认过滤器如下所示:

bodybuilder()
    .aggregations('terms', 'listingType.keyword', 'Type')
    .build()

哪个按预期工作。我有我需要的聚合存储桶。

如果选择了一个项目怎么办?我想添加该过滤器。

这是我想要的样子:

bodybuilder()
    .addFilter('term', 'itemTypeId', 2)
    .aggregations('terms', 'listingType.keyword', 'Type')
    .build()

或者,如果选择了多个项目。

bodybuilder()
    .addFilter('term', 'itemTypeId', id)
    .addFilter('term', 'moo.keyword', moo)
    .addFilter('term', 'make.keyword', make)
    .aggregations('terms', 'listingType.keyword', 'Type')
    .build()

我有一组选定的过滤器。我想我可以做些类似的事情:

const activeFilters = [{type: 'make.keyword, value: 'SAMSUNG'}, {type: 'moo.keyword', value: 'moo'}]

if (activeFilters) {
    activeFilters.map(item => {
        addFilter(item.type, item.value)
    }
}

//OR

bodybuilder()
    activeFilters.map(item => addFilter(item.type, item.value)
    .aggregation('terms' , 'listingType.keyword', 'Type')
    .build()


遵循这些原则。有什么建议吗?

谢谢!

最佳答案

是的,您可以这样做,可以执行以下操作:

const activeFilters = [{type: 'make.keyword, value: 'SAMSUNG'}, {type: 'moo.keyword', value: 'moo'}];
let query = bodybuilder();

activeFilters.forEach(filter => {
  query = query.addFilter('term', filter.type, filter.value);
});

query.aggregation('terms' , 'listingType.keyword', 'Type')
    .build()

这个想法是保留对返回值的引用,而不是链接调用。

关于javascript - 动态建立功能?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55976850/

10-13 07:47