Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> JavaScript

Di chuyển chữ hoa lên đầu chuỗi trong JavaScript

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).