Comments 12
А что думаете по поводу шаблонных языков в качестве фильтров для поиска и решения Вашей проблемы? Для указанных в статье данных это могло бы выглядеть так:
// Человеко читаемый фильтр по пользователям
const usersFilter = `$age == 23 AND $name CONTAINS 'mary'`;
const filteredUsers = yourLib.filter(users, usersFilter);
// Человеко читаемый фильтр по группам
const groupFilter = "$list.name CONTAINS 'Li' OR $groups.groups.list.name CONTAINS 'Li'";
const filteredGroups = yourLib.filter(groups, groupFilter);
// Можно заменить константы, например, через template строку
const userFilters2 = `$age == ${filterValue.age} AND $name CONTAINS '${filterValue.searchText}'`;
Можно и так сделать, но тогда написание собственных правил намного усложняется.
Проброс данных через шаблонные строки работает с плоскими правилами. Если же мы погрузимся вглубь объекта или фильтра, шаблонные строки не очень помогут.
Пример
Проброс данных через шаблонные строки работает с плоскими правилами. Если же мы погрузимся вглубь объекта или фильтра, шаблонные строки не очень помогут.
Пример
const element = {
attributes: [
{
name: "attribute1",
},
{
name: "attribute2",
},
],
};
const filter = {
attribute: {
name: "attribute1",
},
};
someInArray(
elementField("attributes"),
equalProp(filterField("attribute.name"), elementField("name")),
)
По всей видимости я упускаю вашу мысль насчет сложных объектов, но разве это не решается таким образом:
const attrsFilter = `$attributes.name == ${filter.attribute.name}`;
Еще есть Crossfilter
Предпочитаю писать фильтрацию и сортировку в ручную под потребности, на основе Rx.js. Ни одна библиотека не даст такой гибкости
А можете пример привести? rx.js про управление потоками же
Rx.js про управление потоками данных. При использовании можно превратить в "поток" любые данных. Например of([...]). Потом на этот поток можно навесить кучу операторов:
var someDataObservable = of([...]).pipe(
map(...),
switchMap(...),
filter(...),
scan(...)
)
...
someDataObservable.pipe(...someAdditionalOperators).subscribe(data => {...})
Операторов очень много и их хватает на все случаи жизни. Также можно создавать кастомные операторы работы с данными. Во все времена и на мой взгляд все еще, rx js предоставляет большие возможности и гибкость по управлению данными, чем например Es Promises.
Rx не про манипуляцию данными на месте.
Все мощь Rx проявляется в ситуациях когда данные к нам приходят в разные моменты времени, и мы можем описать то как они должны взаимодействовать.
Для фильтрации в приведенном коде нам больше всего понадобится функция map. А внутри уже Ramda тогда. Там тоже есть и pipe и compose
Все мощь Rx проявляется в ситуациях когда данные к нам приходят в разные моменты времени, и мы можем описать то как они должны взаимодействовать.
Для фильтрации в приведенном коде нам больше всего понадобится функция map. А внутри уже Ramda тогда. Там тоже есть и pipe и compose
У нас часто происходит фильтрация месседжей в WebSocket'aх. Но там чаще всего нам нужно сравнивать некоторые поля на полное равенство с определёнными значениями.
То мы юзаем quartet:
import { v } from 'quartet'
const isNotificationMessage = v({
channel: 'notification-channel',
text: v.string
})
Websocket.subscribe(message => {
if (isNotificationMessage(message)) {
handleNotification(message)
}
})
Sign up to leave a comment.
Декларативная фильтрация данных на фронте. JS/TS