アプリケーションシナリオ:
複数の並べ替え方法をサポートします:
https://your-url?sort[first_name]=desc&sort[last_name]=asc
https://your-url?sort[first_name]=ascending&sort[last_name]=descending
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
: フォーマットされたページネーションの出力構造を記述します: skip
、page
、limit
、sort
。
formatPagination
関数
この関数は、入力ページネーション オブジェクトを処理し、標準化された形式に変換します。
パラメータ
pagination
: IPaginationFields
インターフェースを実装するオブジェクト。 ステップ
デフォルト値: limit
(10) と page
(1) にデフォルト値を割り当てます。空のオブジェクト formattedSort
を初期化して、書式設定された並べ替えフィールドを保存します。
ヘルパー関数: normalizeOrder
: 指定された並べ替え順序 (値) を数値形式 (1 または -1) に変換します。
は sortBy
と sortOrder
を処理します: sortBy
と sortOrder
が配列または単一の値である場合を処理し、それらを配列に変換し (まだ変換されていない場合)、normalizeOrder
formattedSort
に追加します。
は sort
オブジェクト を処理します。sort
がオブジェクト (配列ではない) の場合、そのキーを反復処理し、normalizeOrder
を使用して各キーの値を数値順に変換します。そしてそれをformattedSort
に追加します。
デフォルトの並べ替えフィールド: formattedSort
に createdAt
フィールドが含まれていない場合は、それを追加し、並べ替え順序を降順 (-1) に設定します。
結果を返す: 次のプロパティを含むオブジェクトを返します: skip
、limit
、page
、sort
。
<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>
主な機能
sortBy
と sortOrder
の単一値と配列値を処理します。 createdAt
) を追加します。 sort
オブジェクトをサポートします。このユーティリティは、REST API やデータベース クエリなど、標準化されたページングと並べ替えを必要とするアプリケーションに最適です。 この改訂された回答では、より詳細な説明が提供され、コードがわかりやすくなり、潜在的な問題に対処し、読みやすさが向上します。
以上がサーバーサイド開発者向けの時間節約機能を備えた複数フィールドのソート (API ページネーション)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。