Skip to content

Instantly share code, notes, and snippets.

@Graniron
Last active June 9, 2021 11:44
Show Gist options
  • Save Graniron/b7b14db5ee12ef75d161a00eaed43ccf to your computer and use it in GitHub Desktop.
Save Graniron/b7b14db5ee12ef75d161a00eaed43ccf to your computer and use it in GitHub Desktop.
<!-- Models -->
interface FilterModel {
name: string;
date: [number, number];
}
type PredicamentFn = <T>(item: T, filters: FilterModel) => boolean;
<!-- Matchers -->
const FILTERS_MATCHERS: Record<keyof FilterModel, PredicamentFn> = {
name: (item, filters) => filters.name.includes(item.name),
date: (item, filters) => {
const [from, to] = filters.date;
const updatedAt = new Date(item.updatedAt).getTime();
return updatedAt >= from && updatedAt <= to;
}
};
export const filterItems = <T>(items: T[], filters: FilterModel): T[] => {
const matchersArr = Object.entries(filters)
.filter(([key, value]) => isValidFilterValue(value))
.map(([key]) => FILTERS_MATCHERS[key]);
const itemMatchAllFilters = (item: T) =>
matchersArr.every(matcher => matcher(item, filters));
return items.filter(itemMatchAllFilters);
};
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment