Добавление функции поиска по списку объектов без привязки к раскладке (#33)
This commit is contained in:
43
src/core/utils/__test__/performTextSearch.test.ts
Normal file
43
src/core/utils/__test__/performTextSearch.test.ts
Normal file
@ -0,0 +1,43 @@
|
||||
import {performTextSearch} from '../performTextSearch';
|
||||
|
||||
describe('performTextSearch', () => {
|
||||
it('Проверка отфильтрованных значений', () => {
|
||||
const items = [
|
||||
{name: 'Иван', age: 6, color: 'red'},
|
||||
{name: 'Сергей', age: 12, color: 'white'},
|
||||
{name: 'John', age: 33, color: 'black'},
|
||||
{name: 'James', age: 43, color: 'yellow'},
|
||||
];
|
||||
|
||||
expect(performTextSearch(items, 'ива', ['name'])).toEqual([
|
||||
{name: 'Иван', age: 6, color: 'red'},
|
||||
]);
|
||||
expect(performTextSearch(items, 'cth', ['name'])).toEqual([
|
||||
{name: 'Сергей', age: 12, color: 'white'},
|
||||
]);
|
||||
expect(performTextSearch(items, 'utq', ['name'])).toEqual([
|
||||
{name: 'Сергей', age: 12, color: 'white'},
|
||||
]);
|
||||
expect(performTextSearch(items, 'о', ['name'])).toEqual([
|
||||
{name: 'John', age: 33, color: 'black'},
|
||||
{name: 'James', age: 43, color: 'yellow'},
|
||||
]);
|
||||
expect(performTextSearch(items, 'e', ['name', 'color'])).toEqual([
|
||||
{name: 'Иван', age: 6, color: 'red'},
|
||||
{name: 'Сергей', age: 12, color: 'white'},
|
||||
{name: 'James', age: 43, color: 'yellow'},
|
||||
]);
|
||||
expect(performTextSearch(items, '3', ['age'])).toEqual([
|
||||
{name: 'John', age: 33, color: 'black'},
|
||||
{name: 'James', age: 43, color: 'yellow'},
|
||||
]);
|
||||
expect(performTextSearch(items, '', ['age'])).toEqual([
|
||||
{name: 'Иван', age: 6, color: 'red'},
|
||||
{name: 'Сергей', age: 12, color: 'white'},
|
||||
{name: 'John', age: 33, color: 'black'},
|
||||
{name: 'James', age: 43, color: 'yellow'},
|
||||
]);
|
||||
expect(performTextSearch(items, 'sdfsse23', ['age'])).toEqual([]);
|
||||
expect(performTextSearch([], 'sdfsse23', ['age'])).toEqual([]);
|
||||
});
|
||||
});
|
||||
29
src/core/utils/performTextSearch.ts
Normal file
29
src/core/utils/performTextSearch.ts
Normal file
@ -0,0 +1,29 @@
|
||||
import ru from 'convert-layout/ru';
|
||||
import {isEmpty, isNotEmpty} from '../referers/common';
|
||||
|
||||
export function performTextSearch<T, K extends keyof T>(items: T[], searchText: string, searchProperties: K[]) {
|
||||
if (isEmpty(items) || isEmpty(searchText)) {
|
||||
return items;
|
||||
}
|
||||
|
||||
const query = searchText.toLowerCase();
|
||||
const queryToEn = ru.toEn(query);
|
||||
const queryToRu = ru.fromEn(query);
|
||||
|
||||
const hasQuery = (itemText: string) => {
|
||||
const text = itemText.toLowerCase();
|
||||
|
||||
/**
|
||||
* Т.к. convert-layout заменяет не все символы верно,
|
||||
* ищем так же по первоначальной строке
|
||||
* https://github.com/ai/convert-layout/issues/22
|
||||
*/
|
||||
return text.includes(query) || text.includes(queryToEn) || text.includes(queryToRu);
|
||||
};
|
||||
|
||||
return items.filter(item => searchProperties.some(property => {
|
||||
const propertyValue = item[property];
|
||||
const text = isNotEmpty(propertyValue) ? `${propertyValue}` : undefined;
|
||||
return text && hasQuery(text);
|
||||
}));
|
||||
}
|
||||
Reference in New Issue
Block a user