Last active
June 9, 2021 11:44
-
-
Save Graniron/b7b14db5ee12ef75d161a00eaed43ccf to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<!-- 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