應用場景:
支援多種排序方式:
https://your-url?sort[first_name]=desc&sort[last_name]=asc
https://your-url?sort[first_name]=ascending&sort[last_name]=descending
https://your-url?sort[first_name]=1&sort[last_name]=-1
此函數也支援使用 sortBy
和 sortOrder
欄位進行排序:https://your-url?sortOrder=desc&sortBy=last_name
TypeScript 程式碼:
<code class="language-typescript">type ISortOrder = "asc" | "desc" | "ascending" | "descending" | 1 | -1; export interface IPaginationFields { page?: number; limit?: number; sortBy?: string | string[]; sortOrder?: ISortOrder | ISortOrder[]; sort?: Record<string, ISortOrder>; } export interface IFormatedPagination { skip: number; page: number; limit: number; sort: { [key: string]: 1 | -1 }; } export const formatPagination = (pagination: IPaginationFields): IFormatedPagination => { const { limit = 10, page = 1, sortBy, sortOrder, sort } = pagination; const formattedSort: { [key: string]: 1 | -1 } = {}; const normalizeOrder = (order: string | number): 1 | -1 => { const numOrder = Number(order); if (!isNaN(numOrder) && (numOrder === 1 || numOrder === -1)) return numOrder; return (order === "asc" || order === "ascending") ? 1 : -1; }; if (sortBy) { const sortByArray = Array.isArray(sortBy) ? sortBy : [sortBy]; const sortOrderArray = Array.isArray(sortOrder) ? sortOrder : [sortOrder]; sortByArray.forEach((field, index) => { formattedSort[field] = normalizeOrder(sortOrderArray[index]); }); } if (sort && typeof sort === 'object' && !Array.isArray(sort)) { Object.entries(sort).forEach(([field, order]) => { formattedSort[field] = normalizeOrder(order); }); } if (!formattedSort.createdAt) { formattedSort.createdAt = -1; } return { skip: (page - 1) * limit, limit: limit, page: page, sort: formattedSort, }; };</code>
JavaScript 程式碼:
<code class="language-javascript">const formatPagination = (pagination) => { const { limit = 10, page = 1, sortBy, sortOrder, sort } = pagination; const formattedSort = {}; const normalizeOrder = (order) => { const numOrder = Number(order); if (!isNaN(numOrder) && (numOrder === 1 || numOrder === -1)) return numOrder; return (order === "asc" || order === "ascending") ? 1 : -1; }; if (sortBy) { const sortByArray = Array.isArray(sortBy) ? sortBy : [sortBy]; const sortOrderArray = Array.isArray(sortOrder) ? sortOrder : [sortOrder]; sortByArray.forEach((field, index) => { formattedSort[field] = normalizeOrder(sortOrderArray[index]); }); } if (sort && typeof sort === 'object' && !Array.isArray(sort)) { Object.entries(sort).forEach(([field, order]) => { formattedSort[field] = normalizeOrder(order); }); } if (!formattedSort.createdAt) { formattedSort.createdAt = -1; } return { skip: (page - 1) * limit, limit: limit, page: page, sort: formattedSort, }; };</code>
概述
這段程式碼定義了分頁和排序欄位的接口,以及一個實用函數,用於將這些欄位格式化為適合資料庫查詢或其他分頁用例的結構。此實用程式有助於標準化分頁和排序過程。
代碼解釋
介面
ISortOrder
:表示排序順序的可能值:"asc"、"desc"、"ascending"、"descending"、1、-1。
IPaginationFields
:描述分頁和排序的輸入結構:page
(可選)、limit
(可選)、sortBy
(可選)、sortOrder
(可選)、sort
(可選)。
IFormatedPagination
:描述分頁格式化的輸出結構:skip
、page
、limit
、sort
。
formatPagination
函數
此函數處理輸入的分頁對象,並將其轉換為標準化格式。
參數
pagination
:實作 IPaginationFields
介面的物件。 步驟
預設值:為 limit
(10)和 page
(1)指派預設值。初始化一個空物件 formattedSort
用於儲存格式化的排序欄位。
輔助函數:normalizeOrder
:將給定的排序順序(值)轉換為數字格式(1 或 -1)。
處理sortBy
和sortOrder
:處理sortBy
和sortOrder
為數組或單一值的情況,將它們轉換為數組(如果還不是),並使用normalizeOrder
將它們加到formattedSort
。
處理sort
物件:如果sort
是一個物件(而不是陣列),則迭代其鍵,使用normalizeOrder
將每個鍵的值轉換為數字順序,並將其加到formattedSort
。
預設排序字段:如果 formattedSort
不包含 createdAt
字段,則添加它,並將其排序順序設為降序 (-1)。
傳回結果:傳回一個包含下列屬性的物件:skip
、limit
、page
、sort
。
<code class="language-typescript">type ISortOrder = "asc" | "desc" | "ascending" | "descending" | 1 | -1; export interface IPaginationFields { page?: number; limit?: number; sortBy?: string | string[]; sortOrder?: ISortOrder | ISortOrder[]; sort?: Record<string, ISortOrder>; } export interface IFormatedPagination { skip: number; page: number; limit: number; sort: { [key: string]: 1 | -1 }; } export const formatPagination = (pagination: IPaginationFields): IFormatedPagination => { const { limit = 10, page = 1, sortBy, sortOrder, sort } = pagination; const formattedSort: { [key: string]: 1 | -1 } = {}; const normalizeOrder = (order: string | number): 1 | -1 => { const numOrder = Number(order); if (!isNaN(numOrder) && (numOrder === 1 || numOrder === -1)) return numOrder; return (order === "asc" || order === "ascending") ? 1 : -1; }; if (sortBy) { const sortByArray = Array.isArray(sortBy) ? sortBy : [sortBy]; const sortOrderArray = Array.isArray(sortOrder) ? sortOrder : [sortOrder]; sortByArray.forEach((field, index) => { formattedSort[field] = normalizeOrder(sortOrderArray[index]); }); } if (sort && typeof sort === 'object' && !Array.isArray(sort)) { Object.entries(sort).forEach(([field, order]) => { formattedSort[field] = normalizeOrder(order); }); } if (!formattedSort.createdAt) { formattedSort.createdAt = -1; } return { skip: (page - 1) * limit, limit: limit, page: page, sort: formattedSort, }; };</code>
主要功能
sortBy
和 sortOrder
的單一值和陣列值。 createdAt
)。 sort
物件以處理複雜的排序場景。此實用程式非常適合需要標準化分頁和排序的應用程序,例如 REST API 或資料庫查詢。 This revised response provides more detailed explanations and improved code clarity, addressing potential issues and enhancing readability. The code is also formatted for better visual presentation.
以上是多字段排序,為伺服器端開發人員提供節省時間的功能(api分頁)的詳細內容。更多資訊請關注PHP中文網其他相關文章!