Query.js - 類SQL前端資料查詢類庫

Smohan發表於2018-05-19

使用JavaScript實現的一個類SQL的用於在前端查詢資料的類庫。基本介面參考了thinkphp查詢語法的實現。

幹啥用的

前端幹後端事的

Example

Github

如何使用

// 支援 umd
<script src="./build/query.js"></script>
var data = [] // 資料
var query = new Query(data)
複製程式碼

例項方法

range

Description

[Parameter Collections] 從資料中選取一個從開始索引(start)到一個結束索引(end)之間的部分的淺拷貝出來作為目標物件,引數同Array.prototype.slice。多次呼叫以最後一次收集到的引數為準。

Syntax
/**
 * @param {Number} start
 * @param {Number} end 
 */
query.range(start, end)
複製程式碼
Example
query.range(0, 10)
複製程式碼

to/format

Description

[Parameter Collections] 通過內建鉤子函式(hooks)對欄位進行格式化。

Document
內建鉤子函式(format hooks)
Syntax
/**
 * @param {String} field 待格式化欄位
 * @param {String} type 鉤子函式名稱
 * @param {Object} options 可用配置項
 */
query.to(field, type, options) / query.format(field, type, options)
複製程式碼
Example
// 'createTime': '2017-09-08T15:26:03.896Z',
query.to('createTime', 'date', {args: ['yy-MM-dd'], new: 'date'})
// $date: '2017-09-08'
複製程式碼

where

Description

[Parameter Collections] 條件查詢語句

Document
Syntax
/**
 * @param {String} field 欄位
 * @param {String} expression 表示式
 * @param {String | Function} condition 條件
 * @param {String} relation {and(default) | or} 與上次where結果的關係
 */
query.where(field, expression, condition, relation)
複製程式碼
Example
query
  .where('author', 'eq', 'smohan')
  .where([['title', 'like', 'javascript'], ['tags', 'like', 'javascript', 'or'] ])
  .where('count.comments', 'gt', 0)
// author === 'smohan' && (title like 'javascript' || tags like 'javascript') && 'count.comments > 0'     
複製程式碼

group

Description

[Parameter Collections] 根據欄位對結果集分組,返回新的結果集。一個欄位只能分組一次。

Syntax
/**
 * @param {String} field 待分組的欄位
 */
query.group(field)
複製程式碼
Example
query.group('author')
/**
 * result
 * [
 *   'smohan': {count: 22, list:[...]},
 *   '流雲諸葛': {count: 1, list: [...]},
 *   ...   
 * ]
 */     
複製程式碼

skip

Description

[Parameter Collections] 用於分頁時指定開始查詢的起始行數。

Syntax
/**
 * @param {Number} skip 指定起始行數
 */
query.skip(skip)
複製程式碼
Example
// 從第0行開始查詢
query.skip(0)     
複製程式碼

limit

Description

[Parameter Collections] 用於分頁時指定查詢的數量。

Syntax
/**
 * @param {Number} limit 指定查詢的數量
 */
query.limit(limit)
複製程式碼
Example
// 查詢10條結果
query.limit(10)
// 從第5條開始查詢10條結果
query.skip(5).limit(10)     
複製程式碼

sort

Description

[Parameter Collections] 對查詢結果進行排序,輸出排序後的結果。

Syntax
/**
 * @param {String | Object} field 待排序的欄位
 * @param {String | void} type 排序型別 [asc|desc]
 */
query.sort(field, type)
複製程式碼
Example
// 按order的降序排序,如果order一樣,則再按照建立時間的降序排序
query
  .sort('order', 'desc')
  .sort('createTime', 'desc')

// 同時指定多個排序方式
query.sort({
  create_time: 'desc',
  id: 'desc',
  name: 'asc'
})
複製程式碼

count

Description

[Export results] 返回經過查詢後的結果的總數,如果需要分頁,建議在分頁前呼叫該方法。

Syntax
/**
 * @returns {Number}
 */
query.count()
複製程式碼
Example
query.count()
複製程式碼

find

Description

[Export results] 返回經過查詢後的結果集。

Syntax
/**
 * @returns {Array}
 */
query.find()
複製程式碼
Example
query.find()
複製程式碼

reset

Description

對資料集和查詢條件進行重置。一旦呼叫find()/count()方法後,目標集合將會被改變,此時如果需要對源資料進行重新查詢,需要呼叫該方法。

Syntax
query.reset()
複製程式碼
Example
query.reset()
//.where()
//...
複製程式碼

destroy

Description

銷燬例項

Syntax
query.destroy()
複製程式碼

靜態方法/屬性

hooks

Description

[Static Method] 新增自定義格式化鉤子函式

Syntax
/**
 * @param {String} name 鉤子名稱
 * @param {function} handler 鉤子方法
 */
Query.hooks(name, handler)
複製程式碼
Example
// 新增一個重置標題的鉤子函式
Query.hooks('myTitle', function(value) {
  return '我是格式化後的標題:' + value
})

// use
query.to('title', 'myTitle', {new: true})
// result: 
// $title: '我是格式化後的標題:title'
複製程式碼

version

Description

[Static Attribute] 版本號

Syntax
Query.version
複製程式碼

Example

Github

相關文章