File size: 1,373 Bytes
80f4e3d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
function normalizeString(str: string): string {
  return str
    .normalize('NFD')
    .replace(/[\u0300-\u036f]/g, '')
    .toLowerCase();
}

export function advancedOperatorsSearch(data: string, query: string): boolean {
  const filters = query.split(' ').reduce((acc: Record<string, string[]>, filter) => {
    const [operator, ...values] = filter.split(':');
    const value = values.join(':');

    if (!acc[operator]) {
      acc[operator] = [];
    }
    acc[operator].push(value);
    return acc;
  }, {});

  const normalizedItem = normalizeString(data);

  return Object.entries(filters).every(([operator, values]) => {
    return values.some((val) => {
      const subValues = val.split(',');
      return subValues.every((subVal) => {
        const normalizedSubVal = normalizeString(subVal);

        switch (operator.toLowerCase()) {
          case 'contains':
            return normalizedItem.includes(normalizedSubVal);
          case 'notcontains':
            return !normalizedItem.includes(normalizedSubVal);
          case 'startswith':
            return normalizedItem.startsWith(normalizedSubVal);
          case 'endswith':
            return normalizedItem.endsWith(normalizedSubVal);
          case 'exact':
            return normalizedItem === normalizedSubVal;
          default:
            return false;
        }
      });
    });
  });
}