Построение функции динамически? - PullRequest
1 голос
/ 03 мая 2019

Я использую конструктор запросов с именем 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 ]

2 голосов
/ 03 мая 2019

Да, вы можете сделать это, вы можете сделать что-то вроде этого:

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 голос
/ 04 мая 2019

Я бы предложил использовать для этого случая уменьшение:

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

Есть одна проблема с решением Тита - вы не можете переназначить const, поэтому в текущей форме это, скорее всего, не будет работать.Если вы собираетесь использовать его код, вам нужно изменить query объявление переменной с const на let.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...