> 웹 프론트엔드 > 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

이 기능은 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>
로그인 후 복사
로그인 후 복사

자바스크립트 코드:

<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)으로 변환합니다.

  • sortBysortOrder을 처리합니다. sortBysortOrder이 배열 또는 단일 값인 경우를 처리하고 이를 배열로 변환하고(아직 배열이 아닌 경우) normalizeOrder에 추가하세요. formattedSort

  • sort 객체를 처리합니다 : sort가 객체(배열 아님)인 경우 해당 키를 반복하고 normalizeOrder를 사용하여 각 키의 값을 숫자 순서로 변환합니다. formattedSort에 추가하세요.

  • 기본 정렬 필드: formattedSortcreatedAt 필드가 없으면 이를 추가하고 정렬 순서를 내림차순(-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>
로그인 후 복사
로그인 후 복사

주요 기능

  • 유연한 입력: sortBysortOrder의 단일 및 배열 값을 처리합니다.
  • 기본값: 입력이 불완전한 경우에도 페이지 매김이 제대로 작동하도록 합니다.
  • 기본 정렬: 대체 정렬 필드를 추가합니다(createdAt).
  • 사용자 정의 정렬: sort 개체를 지원하여 복잡한 정렬 시나리오를 처리합니다. 이 유틸리티는 REST API 또는 데이터베이스 쿼리와 같이 표준화된 페이징 및 정렬이 필요한 애플리케이션에 이상적입니다.

이 개정된 응답은 더 자세한 설명과 향상된 코드 명확성을 제공하여 잠재적인 문제를 해결하고 가독성을 향상시킵니다.

위 내용은 서버측 개발자를 위한 시간 절약 기능을 갖춘 다중 필드 정렬(API 페이지 매김)의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿