應用場景:
支持多種排序方式:
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 代碼:
type ISortOrder = "asc" | "desc" | "ascending" | "descending" | 1 | -1;
export interface IPaginationFields {
page?: number;
limit?: number;
sortBy?: string | string[];
sortOrder?: ISortOrder | ISortOrder[];
sort?: Record;
}
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,
};
};
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,
};
};
概述
這段代碼定義了分頁和排序字段的接口,以及一個實用函數,用於將這些字段格式化為適合數據庫查詢或其他分頁用例的結構。此實用程序有助於標準化分頁和排序過程。
代碼解釋
接口
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
。
const pagination = {
page: 2,
limit: 20,
sortBy: ['name', 'date'],
sortOrder: ['asc', 'desc'],
sort: { age: 1, score: -1 },
};
const formatted = formatPagination(pagination);
console.log(formatted);
主要功能
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.
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3