Я создаю этот шаблон Builder, и я хотел бы объединить некоторые элементы из списка вместе. Но я хотел бы сделать это чище. Это то, к чему я пришел, пока работает, но я уверен, что есть лучший способ сделать это.Как условно объединить некоторые элементы в списке в JavaScript?
function FiltersBuilder() {
this.filters = [];
};
FiltersBuilder.prototype.addFilter = function(options) {
var filter = {
'type': 'selector',
'dimension': options.dimension,
'value': options.value
}
this.filters.push(filter);
return this;
}
FiltersBuilder.prototype.addRegexFilter = function(options) {
var filter = {
'type': 'regex',
'dimension': options.dimension,
'pattern': options.value
}
this.filters.push(filter);
return this;
}
FiltersBuilder.prototype.not = function() {
var not = {
'type': 'not'
};
this.filters.push(not);
return this;
}
FiltersBuilder.prototype.getFilters = function() {
var result = [];
this.filters.forEach(function each(filter, index, theFilters) {
if (filter.type === 'not') {
var filterToMerge = theFilters[index + 1];
var mergedFilter = _.merge(filter, {field: filterToMerge});
result.push(mergedFilter);
} else {
if(index > 0) {
notFilter = theFilters[index - 1];
if(notFilter.type === 'not') {
return;
}
}
result.push(filter);
}
});
return result;
}
var filterBuilder = new FiltersBuilder();
filterBuilder.addFilter({
dimension: '_o',
value: 'origin'
});
filterBuilder.not().addRegexFilter({
dimension: 'cTy',
value: 'value'
});
console.log(filterBuilder.getFilters());
Если not
метод вызывается перед добавлением фильтра, я хотел бы объединить not
фильтр на следующий элемент и добавить этот объект в список result
. Но если not
не вызывается перед добавлением фильтра, тогда ничего не делайте, просто добавьте фильтр в список result
.
https://jsfiddle.net/9wyqbovu/
Мне нравится ваш подход лучше, чем у меня , благодаря! – toy