应用场景:
您可以使用多种方式指定排序顺序,例如:
升序/降序: https://your-url?sort[first_name]=desc&sort[last_name]=ascascending/descending: https://your-url?sort[first_name]=ascending&sort[last_name]=descending1/-1: https://your-url?sort[first_name]=1&sort[last_name]=-1sortby 和 sortorder 参数: https://your-url?sortorder=desc&sortby=last_name
此函数还能处理 sortby 和 sortorder 参数。
TypeScript 代码:
type SortOrder = "asc" | "desc" | "ascending" | "descending" | 1 | -1;export interface IPaginationFields { page?: number; limit?: number; sortby?: string | string[]; sortorder?: SortOrder | SortOrder[]; sort?: Record;}export interface IFormattedPagination { skip: number; page: number; limit: number; sort: Record;}export const formatPagination = ( pagination: IPaginationFields): IFormattedPagination => { const { limit = 10, page = 1, sortby, sortorder, sort = {} } = pagination; const formattedSort: Record = {}; const normalizeOrder = (value: string | number): 1 | -1 => { const numValue = Number(value); if (!isNaN(numValue) && (numValue === 1 || numValue === -1)) { return numValue; } else { return value === "asc" || value === "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]); }); } Object.entries(sort).forEach(([field, order]) => { formattedSort[field] = normalizeOrder(order); }); if (!formattedSort.createdAt) { formattedSort.createdAt = -1; } return { skip: (page - 1) * limit, limit: Number(limit), page: Number(page), sort: formattedSort, };};
登录后复制
JavaScript 代码:
const formatPagination = (pagination) => { const { limit = 10, page = 1, sortby, sortorder, sort = {} } = pagination; const formattedSort = {}; const normalizeOrder = (value) => { const numValue = Number(value); if (!isNaN(numValue) && (numValue === 1 || numValue === -1)) { return numValue; } else { return value === "asc" || value === "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]); }); } Object.entries(sort).forEach(([field, order]) => { formattedSort[field] = normalizeOrder(order); }); if (!formattedSort.createdAt) { formattedSort.createdAt = -1; } return { skip: (page - 1) * limit, limit: Number(limit), page: Number(page), sort: formattedSort, };};
登录后复制
功能概述:
这段代码提供了一个函数 formatPagination,用于将各种分页和排序参数规范化为数据库查询或其他后端系统易于理解的格式。它支持多种排序参数格式,并提供默认值和默认排序字段 (createdAt) 以增强健壮性。
代码说明:
类型定义: SortOrder 枚举定义了所有支持的排序值。IPaginationFields 和 IFormattedPagination 接口定义了输入和输出对象的结构。
formatPagination 函数: 该函数解析输入参数,并将其转换为标准化的 IFormattedPagination 对象。 normalizeOrder 辅助函数将各种排序值(字符串或数字)转换为统一的 1 (升序) 或 -1 (降序) 表示。 函数处理 sortby/sortorder 和 sort 对象两种参数形式,并添加默认的 createdAt 排序。
示例用法: 提供的示例展示了如何使用该函数以及其输出结果。
主要优势:
灵活的输入: 支持多种排序参数格式,提高了代码的可复用性和灵活性。健壮性: 提供默认值和默认排序字段,确保即使输入参数不完整也能正常工作。可读性和可维护性: 使用 TypeScript 接口和类型定义,提高了代码的可读性和可维护性。标准化输出: 将排序参数转换为统一的格式,方便数据库查询或其他后端操作。
这个改进后的版本更简洁、更易于理解,并且更好地处理了各种输入情况。
以上就是多字段排序,为服务器端开发人员提供节省时间的功能(api分页)的详细内容,更多请关注【创想鸟】其它相关文章!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至253000106@qq.com举报,一经查实,本站将立刻删除。
发布者:PHP中文网,转转请注明出处:https://www.chuangxiangniao.com/p/2641939.html