Jsqry — бібліотека для запитів до JS об'єктів і масивів

Представляю вашій увазі невелику js-бібліотеку Jsqry.
Найпростіше проілюструвати її призначення наступним прикладом.
До:
var name;
for (var i = 0; i < users.length; i++) {
if (users[i].id == 123) {
name = users[i].name;
break;
}
}

Після:
var name = one(users, '[_.id==?].name', 123);

Бібліотечка дозволяє отримувати інформацію з об'єктів/масивів в один рядок, використовуючи нескладну мову запитів, замість написання циклів (часом вкладених).
По суті, вона реалізує дві функції:
  • query — для повернення списку результатів і
  • one — для повернення першого знайденого результату.
Список можливостей включає:
  1. Фільтрацію
  2. Трансформацію
  3. Індекси/зрізи в стилі Python
Бібліотека з'явилася спонтанно в одному проекті, побудованому на модному нині підході односторінкового програми. Ми завантажуємо один великий JSON, частини якого потім використовуються для візуалізації на клієнті різних уявлень сайту. І ось для видирання цих частин і захотілося більш зручного способу. Потім, втім, бібліотека виявилася затребуваною і в інших випадках.
Поясню трохи по функціоналу. Запит в загальному випадку може мати вигляд
field1.field2[ or condition index or slice ].field3{ transformation }.field4

Тут:
  • field1.field2.field3... — звичайний доступ до полів об'єктів, як в js
  • [ condition ] — фільтрація
  • [ index ] — доступ по індексу, теж як в js
  • [ from:to:step ]зрізи в стилі Python
  • { transformation } — перетворення об'єктів
condition і transformation варто зупинитися докладніше.
Насправді тут все дуже просто. Досить зрозуміти, що кожен вираз всередині квадратних/фігурних дужок при виконанні замінюється на функцію за таким принципом:
condition_or_transformation ⟶ function(_,i) { return condition_or_transformation }
тут _ — значення переданого елемента, i — його індекс).
Приклад:
query([1,2,3,4,5],'[_>2]{_+10}') // [13, 14, 15]

Також підтримуються параметризація запиту:
query([1,2,3,4,5],'[_>?]{_+?}', 2, 10) // [13, 14, 15] 

Комбінуючи ці можливості можна будувати досить складні і гнучкі запити. Більше прикладів використання можна подивитися тут.
З цікавого в реалізації — AST дерево запиту кешується, що надає бібліотеці швидкості.
Зрозуміло, моя бібліотека не унікальна в своєму роді. Варто навести "невеликий" список аналогів:
Навіщо ще одна бібліотека? Насправді, вона підтримує не весь можливий спектр типів запитів, а тільки те що було потрібно в нашому проекті в більшості випадків. За рахунок цього простота і швидкість. Також, надзвичайно простий API, натхненний підходом JQuery.
Буду радий вислухати критику і пропозиції щодо покращення.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.