적용 시나리오:
다양한 정렬 방법 지원:
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>
자바스크립트 코드:
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!