Skip to content

Instantly share code, notes, and snippets.

@sanex3339
Created April 28, 2018 12:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save sanex3339/084b0d42d4526cc7fe377530e5f39887 to your computer and use it in GitHub Desktop.
Save sanex3339/084b0d42d4526cc7fe377530e5f39887 to your computer and use it in GitHub Desktop.
type Condition<T> = {shouldApply: boolean, conditionFunc: ((item: T) => boolean)};
/**
* Фильтрует данные на основе массива ф-ий условий
* В случае отсутствия фильтров или когда не применен ни один фильтр - возвращается оригинальный массив данных
*/
export class ConditionFilter <T> {
/**
* Константа, для того, чтобы всегда применять фильтр
*/
public static APPLY: boolean = true;
/**
* Данные
*/
private readonly data: T[];
/**
* Массив условий
*/
private conditions: Condition <T> [] = [];
constructor(data: T[]) {
this.data = data;
}
/**
* Добавляет новое условие
*/
public addCondition(shouldApply: boolean, conditionFunc: (item: T) => boolean): this {
this.conditions.push({shouldApply, conditionFunc});
return this;
}
/**
* Выполняет фильтрацию
*/
public filter(): T[] {
let isFilterWasApplied: boolean = false;
const filteredData: T[] = this.data.reduce(
(filteredData: T[], item: T) => {
let isFilteredItem: boolean = true;
for (const condition of this.conditions) {
const {shouldApply, conditionFunc} = condition;
if (!shouldApply) {
continue;
}
isFilterWasApplied = true;
isFilteredItem = conditionFunc(item);
if (!isFilteredItem) {
break;
}
}
if (!isFilteredItem) {
return filteredData;
}
return [...filteredData, item];
},
[]
);
return isFilterWasApplied ? filteredData : this.data;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment