anitimejs
Version:
Thư viện xử lý chuỗi số và thời gian trong JavaScript/Typescript
65 lines (64 loc) • 2.55 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.sortArray = void 0;
const sortArray = (array, options = {}) => {
if (!array || !Array.isArray(array)) {
return [];
}
const { key, order = "asc", deepKeys = [], customCompare, nullsPosition = 'last' } = options;
// Hàm so sánh cơ bản với xử lý null/undefined
const baseCompare = (a, b) => {
// Xử lý giá trị null hoặc undefined
if (a === undefined || a === null) {
return nullsPosition === 'first' ? -1 : 1;
}
if (b === undefined || b === null) {
return nullsPosition === 'first' ? 1 : -1;
}
// So sánh dựa trên kiểu dữ liệu
if (typeof a === 'string' && typeof b === 'string') {
return a.localeCompare(b);
}
if (a instanceof Date && b instanceof Date) {
return a.getTime() - b.getTime();
}
if (a === b)
return 0;
return a > b ? 1 : -1;
};
// Hàm xử lý sắp xếp chính
const sortFn = (a, b) => {
// Sử dụng hàm so sánh tùy chỉnh nếu được cung cấp
if (customCompare) {
return order === "asc" ? customCompare(a, b) : customCompare(b, a);
}
const valueA = key ? a[key] : a;
const valueB = key ? b[key] : b;
let result = baseCompare(valueA, valueB);
if (order === "desc")
result *= -1;
return result;
};
// Tạo bản sao để tránh thay đổi mảng gốc và sắp xếp
const sortedArray = [...array].sort(sortFn);
// Xử lý các mảng con theo `deepKeys`
if (deepKeys.length > 0) {
for (const item of sortedArray) {
for (const { deepKey, sortKey, order: deepOrder = "asc" } of deepKeys) {
if (item && item[deepKey]) {
if (Array.isArray(item[deepKey])) {
// Xử lý đệ quy các mảng con, nhưng loại bỏ deepKeys để tránh vòng lặp vô hạn
item[deepKey] = (0, exports.sortArray)(item[deepKey], {
key: sortKey,
order: deepOrder,
nullsPosition,
// Không truyền lại deepKeys để tránh xử lý đệ quy vô hạn
});
}
}
}
}
}
return sortedArray;
};
exports.sortArray = sortArray;