«Если рабочий хочет хорошо выполнять свою работу, он должен сначала заточить свои инструменты» — Конфуций, «Аналитики Конфуция. Лу Лингун»
титульная страница > программирование > Сортировка нескольких полей с функцией сохранения времени для разработчика на стороне сервера (API Pagination)

Сортировка нескольких полей с функцией сохранения времени для разработчика на стороне сервера (API Pagination)

Опубликовано в 2025-02-24
Просматривать:324

Multiple fields sorting with a time saving function for server side developer (api pagination)

сценарий приложения:

]

asc

https: // your-url? Sort [first_name] = desc & sort [fast_name] = asc
  • ]] Используйте восходящую или нисходящую: https: // your-url? Sort [first_name] = ascending & sort [fast_name] = gancending
  • ] используйте 1 или -1: https: // your-url?
  • ]
  • Эта функция также поддерживает сортировку с использованием sortby и
  • sortorder
fields:

https: // your-url? Sortordor = desc & sortby = fast_name ]]] код TypeScript:

: 1 | } экспорт const formatPagination = (Pagination: ipaginationFields): iformatedPagination => { const {limit = 10, page = 1, sortby, sortorder, sort} = pagination; const formattedsort: {[key: string]: 1 | ConstrailizeOrder = (заказ: строка | номер): 1 | const numorder = number (order); if (! isnan (numorder) && (numomore === 1 || numorome === -1)) вернуть Numorder; return (order === "asc" }; if (sortby) { const sortbyarray = array.isarray (sortby)? const sortorderray = array.isarray (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; } возвращаться { Skip: (Page - 1) * Limit, предел: предел, Страница: страница, Сортировка: FormattedSort, }; };

javascript code:
type ISortOrder = "asc" | "desc" | "ascending" | "descending" | 1 | -1;

export interface IPaginationFields {
    page?: number;
    limit?: number;
    sortBy?: string | string[];
    sortOrder?: ISortOrder | ISortOrder[];
    sort?: Record;
}

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,
    };
};
const formatpagination = (pagination) => { const {limit = 10, page = 1, sortby, sortorder, sort} = pagination; const formattedSort = {}; Const NormalizeOrder = (order) => { const numorder = number (order); if (! isnan (numorder) && (numomore === 1 || numorome === -1)) вернуть Numorder; return (order === "asc" }; if (sortby) { const sortbyarray = array.isarray (sortby)? const sortorderray = array.isarray (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; } возвращаться { Skip: (Page - 1) * Limit, предел: предел, Страница: страница, Сортировка: FormattedSort, }; };

обзор
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,
    };
};
]

кодовое объяснение

]

интерфейс

isortorder

: возможные значения, представляющие порядок сортировки: "ASC", "desc", "ascending", "Discending", 1, -1. ]

ipaginationFields

: Опишите структуру ввода лиц и сортировки: page (необязательно),

(необязательно),

sortby ]]] ]]]]]]]]] (Необязательно), sortorder (необязательно), sort (необязательно). ] iformatedPagination : Опишите структуру вывода форматированной страниц: skip , page

,

limit , sort ] ]]]. ] formatPagination function ] эта функция обрабатывает входной объект подкидки и преобразует его в стандартизированный формат. ]

parameter ]

]

Pagination

: объект, который реализует интерфейс iPaginationFields .

]
    ]
  • шаг ]
  • ]

значение по умолчанию : назначить значения по умолчанию Limit

(10) и
    page
  • (1). Инициализировать пустой объект

    formattedStort используется для хранения форматированных полей сортировки. ] ] ] Helper Function: normalizeorder

    : преобразовать заданный порядок сортировки (значение) в числовой формат (1 или -1).
  • ]
  • ]

    ] gange sortby и

    sortorder
  • : обрабатывает случай, где

    sortby и sortordor , Преобразовать их в массив (если еще не), и добавьте их в formattedSort с использованием normalizeorder . ] ] ] gange sort object : if

    sort
  • - объект (не массив), итерации над его ключом и использует
  • normalizeordorder

    to to to to to to to to to to to to Значение каждого ключа преобразуется в числовой порядок и добавляется в formattedSort . ] ] ] по умолчанию Sort Sort : if formattedSort не содержит поля

    createdat
  • , добавьте его и установите порядок сортировки в спуск (-1).
  • ]

    ] ] return result : возвращать объект со следующими атрибутами: skip ,

    limit
  • ,
  • page

    , sort ]. ] ] ] const pagination = { Страница: 2, Предел: 20, sortby: ['name', 'date'], sortorder: ['asc', 'desc'], Сортировка: {возраст: 1, оценка: -1}, }; const formatted = formatpagination (страница); console.log (formatted); ]

    основные функции
const pagination = {
  page: 2,
  limit: 20,
  sortBy: ['name', 'date'],
  sortOrder: ['asc', 'desc'],
  sort: { age: 1, score: -1 },
};

const formatted = formatPagination(pagination);

console.log(formatted);
и

sortorder . ]

по умолчанию: даже если ввод неполный, он гарантирует, что пейджинг работает должным образом.
    ]
  • по умолчанию: добавить поле Sortback Sort ( creatementAt ). ] Custom Sort: поддерживает
  • sort
  • объекты для обработки сложных сценариев сортировки. Эта утилита идеально подходит для приложений, которые требуют стандартизированной пейджинг и сортировки, таких как API REST или запросы базы данных.
  • ]
  • ] Этот пересмотренный ответ обеспечивает более подробные объяснения и улучшенную ясность кода, решает потенциальные проблемы и улучшая читаемость.
Последний учебник Более>

Изучайте китайский

Отказ от ответственности: Все предоставленные ресурсы частично взяты из Интернета. В случае нарушения ваших авторских прав или других прав и интересов, пожалуйста, объясните подробные причины и предоставьте доказательства авторских прав или прав и интересов, а затем отправьте их по электронной почте: [email protected]. Мы сделаем это за вас как можно скорее.

Copyright© 2022 湘ICP备2022001581号-3