首页 >web前端 >js教程 >多字段排序,为服务器端开发人员提供节省时间的功能(api分页)

多字段排序,为服务器端开发人员提供节省时间的功能(api分页)

Susan Sarandon
Susan Sarandon原创
2025-01-23 18:39:11827浏览

Multiple fields sorting with a time saving function for server side developer (api pagination)

应用场景:

支持多种排序方式:

  • 升序或降序:https://your-url?sort[first_name]=desc&sort[last_name]=asc
  • 使用 ascending 或 descending:https://your-url?sort[first_name]=ascending&sort[last_name]=descending
  • 使用 1 或 -1:https://your-url?sort[first_name]=1&sort[last_name]=-1

此函数还支持使用 sortBysortOrder 字段进行排序: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:描述格式化分页的输出结构:skippagelimitsort

formatPagination 函数

此函数处理输入的分页对象,并将其转换为标准化格式。

参数

  • pagination:实现 IPaginationFields 接口的对象。

步骤

  • 默认值:为 limit(10)和 page(1)分配默认值。初始化一个空对象 formattedSort 用于存储格式化的排序字段。

  • 辅助函数:normalizeOrder:将给定的排序顺序(值)转换为数字格式(1 或 -1)。

  • 处理 sortBysortOrder:处理 sortBysortOrder 为数组或单个值的情况,将它们转换为数组(如果还不是),并使用 normalizeOrder 将它们添加到 formattedSort

  • 处理 sort 对象:如果 sort 是一个对象(而不是数组),则迭代其键,使用 normalizeOrder 将每个键的值转换为数字顺序,并将其添加到 formattedSort

  • 默认排序字段:如果 formattedSort 不包含 createdAt 字段,则添加它,并将其排序顺序设置为降序 (-1)。

  • 返回结果:返回一个包含以下属性的对象:skiplimitpagesort

<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>

主要功能

  • 灵活的输入:处理 sortBysortOrder 的单个值和数组值。
  • 默认值:即使输入不完整也能确保分页正常工作。
  • 默认排序:添加一个后备排序字段(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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn