应用场景:
支持多种排序方式:
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中文网其他相关文章!