ホームページ > ウェブフロントエンド > jsチュートリアル > サーバーサイド開発者向けの時間節約機能を備えた複数フィールドのソート (API ページネーション)

サーバーサイド開発者向けの時間節約機能を備えた複数フィールドのソート (API ページネーション)

Susan Sarandon
リリース: 2025-01-23 18:39:11
オリジナル
818 人が閲覧しました

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
  • 昇順または降順を使用します: https://your-url?sort[first_name]=ascending&sort[last_name]=descending
  • 1 または -1 を使用します: 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: フォーマットされたページネーションの出力構造を記述します: skippagelimitsort

formatPagination 関数

この関数は、入力ページネーション オブジェクトを処理し、標準化された形式に変換します。

パラメータ

  • pagination: IPaginationFields インターフェースを実装するオブジェクト。

ステップ

  • デフォルト値: limit (10) と page (1) にデフォルト値を割り当てます。空のオブジェクト formattedSort を初期化して、書式設定された並べ替えフィールドを保存します。

  • ヘルパー関数: normalizeOrder: 指定された並べ替え順序 (値) を数値形式 (1 または -1) に変換します。

  • sortBysortOrder を処理します: sortBysortOrder が配列または単一の値である場合を処理し、それらを配列に変換し (まだ変換されていない場合)、normalizeOrder formattedSort に追加します。

  • sort オブジェクト を処理します。sort がオブジェクト (配列ではない) の場合、そのキーを反復処理し、normalizeOrder を使用して各キーの値を数値順に変換します。そしてそれをformattedSortに追加します。

  • デフォルトの並べ替えフィールド: formattedSortcreatedAt フィールドが含まれていない場合は、それを追加し、並べ替え順序を降順 (-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 やデータベース クエリなど、標準化されたページングと並べ替えを必要とするアプリケーションに最適です。

この改訂された回答では、より詳細な説明が提供され、コードがわかりやすくなり、潜在的な問題に対処し、読みやすさが向上します。

以上がサーバーサイド開発者向けの時間節約機能を備えた複数フィールドのソート (API ページネーション)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート