动态建立功能?

时间:2019-05-03 20:41:36

标签: javascript reactjs elasticsearch

我正在使用一个名为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()

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

谢谢!

2 个答案:

答案 0 :(得分:2)

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

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()

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

答案 1 :(得分:1)

在这种情况下,我建议使用reduce

const query = activeFilters.reduce((query, filter) => query.addFilter('term', filter.type, filter.value), bodybuilder())
    .aggregation('terms' , 'listingType.keyword', 'Type')
    .build();

Titus解决方案存在一个问题-您无法重新分配const,因此在当前形式下,它很可能行不通。如果要使用他的代码,则需要将query的变量声明从const更改为let