首頁 >web前端 >js教程 >多字段排序,為伺服器端開發人員提供節省時間的功能(api分頁)

多字段排序,為伺服器端開發人員提供節省時間的功能(api分頁)

Susan Sarandon
Susan Sarandon原創
2025-01-23 18:39:11869瀏覽

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