directus

Форк
0
/
filter-items.ts 
36 строк · 1.2 Кб
1
import type { FieldFilter, Item, Query } from '@directus/types';
2
import { generateJoi } from '@directus/utils';
3

4
/*
5
 Note: Filtering is normally done through SQL in run-ast. This function can be used in case an already
6
 existing array of items has to be filtered using the same filter syntax as used in the ast-to-sql flow
7
 */
8

9
export function filterItems<T extends Item[]>(items: T, filter: Query['filter']): T {
10
	if (!filter) return items;
11

12
	return items.filter((item) => passesFilter(item, filter)) as T;
13

14
	function passesFilter(item: Item, filter: Query['filter']): boolean {
15
		if (!filter || Object.keys(filter).length === 0) return true;
16

17
		if (Object.keys(filter)[0] === '_and') {
18
			const subfilter = Object.values(filter)[0] as Query['filter'][];
19

20
			return subfilter.every((subFilter) => {
21
				return passesFilter(item, subFilter);
22
			});
23
		} else if (Object.keys(filter)[0] === '_or') {
24
			const subfilter = Object.values(filter)[0] as Query['filter'][];
25

26
			return subfilter.some((subFilter) => {
27
				return passesFilter(item, subFilter);
28
			});
29
		} else {
30
			const schema = generateJoi(filter as FieldFilter);
31

32
			const { error } = schema.validate(item);
33
			return error === undefined;
34
		}
35
	}
36
}
37

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.