Sắp xếp ký tự: Chữ hoa lên đầu
Sử dụng sort() với comparator dựa trên regex /[A-Z]/ để đưa chữ cái in hoa lên đầu chuỗi.
Ví dụ từ bài gốc
const moveAllCapitalLettersAtTheBeginning = [...' my name is JOHN SMITH ']
.sort((value1, value2) =>
/[A-Z]/.test(value1)
? /[A-Z]/.test(value2) ? 0 : -1
: 0
)
.join('');
console.log(moveAllCapitalLettersAtTheBeginning);
// "JOHNSMITH my name is "
Giải thích logic sort
// Comparator trả về:
// -1: value1 trước value2
// 0: giữ nguyên thứ tự
// 1: value1 sau value2
(a, b) => {
const aUpper = /[A-Z]/.test(a);
const bUpper = /[A-Z]/.test(b);
if (aUpper && bUpper) return 0; // Cả 2 hoa -> giữ nguyên
if (aUpper && !bUpper) return -1; // a hoa, b thường -> a trước
if (!aUpper && bUpper) return 1; // a thường, b hoa -> a sau
return 0; // Cả 2 thường -> giữ nguyên
}
Cách rõ ràng hơn (Khuyến nghị)
function moveUppercaseFirst(str) {
// Tách thành 2 nhóm
const upper = [];
const lower = [];
for (const char of str) {
if (/[A-Z]/.test(char)) {
upper.push(char);
} else {
lower.push(char);
}
}
return upper.join('') + lower.join('');
}
console.log(moveUppercaseFirst(' my name is JOHN SMITH '));
// "JOHNSMITH my name is "
// Hoặc dùng filter (ngắn gọn)
const moveUpper = str =>
[...str].filter(c => /[A-Z]/.test(c)).join('') +
[...str].filter(c => !/[A-Z]/.test(c)).join('');
// Giữ nguyên thứ tự tương đối trong mỗi nhóm (stable)
Mở rộng: Sắp xếp theo nhiều tiêu chí
// 1. Chữ hoa trước, rồi chữ thường, rồi số, rồi ký tự đặc biệt
function customSort(str) {
const groups = {
upper: [],
lower: [],
digit: [],
other: []
};
for (const c of str) {
if (/[A-Z]/.test(c)) groups.upper.push(c);
else if (/[a-z]/.test(c)) groups.lower.push(c);
else if (/\d/.test(c)) groups.digit.push(c);
else groups.other.push(c);
}
return [...groups.upper, ...groups.lower, ...groups.digit, ...groups.other].join('');
}
console.log(customSort('aB1!cD2@')); // 'BDac12!@'
// 2. Locale-aware sort (hỗ trợ tiếng Việt)
const vietnamese = ['á', 'a', 'ă', 'â', 'b'];
console.log(vietnamese.sort((a, b) => a.localeCompare(b, 'vi')));
// ['a', 'á', 'â', 'ă', 'b'] - đúng thứ tự tiếng Việt
Lưu ý về sort()
sort()**sửa đổi mảng gốc** (mutate).- Mặc định sort theo **Unicode code point** (số -> hoa -> thường).
- Comparator phải trả về số: âm, 0, dương.
- ES2019:
Array.prototype.sort()ổn định (stable sort).