」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 使用服務器端開發人員的時間節省功能(API分頁)進行多個字段排序

使用服務器端開發人員的時間節省功能(API分頁)進行多個字段排序

發佈於2025-02-24
瀏覽:907

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 代碼:

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:描述格式化分頁的輸出結構:skippagelimitsort

formatPagination 函數

此函數處理輸入的分頁對象,並將其轉換為標準化格式。

參數

  • pagination:實現 IPaginationFields 接口的對象。

步驟

  • 默認值:為 limit(10)和 page(1)分配默認值。初始化一個空對象 formattedSort 用於存儲格式化的排序字段。

  • 輔助函數:normalizeOrder:將給定的排序順序(值)轉換為數字格式(1 或 -1)。

  • 處理sortBysortOrder:處理sortBysortOrder 為數組或單個值的情況,將它們轉換為數組(如果還不是),並使用normalizeOrder 將它們添加到formattedSort

  • 處理sort 對象:如果sort 是一個對象(而不是數組),則迭代其鍵,使用normalizeOrder 將每個鍵的值轉換為數字順序,並將其添加到formattedSort

  • 默認排序字段:如果 formattedSort 不包含 createdAt 字段,則添加它,並將其排序順序設置為降序 (-1)。

  • 返回結果:返回一個包含以下屬性的對象:skiplimitpagesort

const pagination = {
  page: 2,
  limit: 20,
  sortBy: ['name', 'date'],
  sortOrder: ['asc', 'desc'],
  sort: { age: 1, score: -1 },
};

const formatted = formatPagination(pagination);

console.log(formatted);

主要功能

  • 靈活的輸入:處理 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.

最新教學 更多>

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3