3 回答

TA貢獻1820條經驗 獲得超2個贊
您需要將羅馬數字轉換為普通(阿拉伯)數字進行比較。由于羅馬數字的數量非常有限,最簡單的方法就是對它們進行硬編碼 - 如果您只有 12 個不同的可能輸入,則無需涉及轉換它們的算法。
使用I到XII的硬編碼值,您可以通過拆分字符串并根據多個條件進行排序-
:
按破折號之前的部分作為數字排序。
破折號后面的部分作為字符串。
const romanTable = {
? "I"? ?: 1,
? "II"? : 2,
? "III" : 3,
? "IV"? : 4,
? "V"? ?: 5,
? "VI"? : 6,
? "VII" : 7,
? "VIII": 8,
? "IX"? : 9,
? "X"? ?: 10,
? "XI"? : 11,
? "XII" : 12,
};
const arr = ["II-A", "II-B", "I-A", "IV-A", "IV-B"];
arr.sort((a, b) => {
? const [mainA, secondaryA] = a.split("-");
? const [mainB, secondaryB] = b.split("-");
??
? if (mainA !== mainB)
? ? return romanTable[mainA] - romanTable[mainB];
? ?
? return secondaryA.localeCompare(secondaryB);
});
console.log(arr);

TA貢獻1906條經驗 獲得超3個贊
由于學校成績僅限于 12 名,因此按字母順序排序并不是那么糟糕。對于您給出的示例,您可以只調用.sort()該數組就可以了。
實際上,只有“IX”會被排序在錯誤的位置。那么讓我們來處理這個問題:
let classes = ["XII-A", "IX-A", "VII-A", "II-A", "II-B", "I-A", "IV-A", "IV-B"];
let trans = s => s.replace("IX", "VIIJ");
classes.sort((a, b) => trans(a).localeCompare(trans(b)));
console.log(classes);

TA貢獻1886條經驗 獲得超2個贊
這里我通過迭代每個羅馬字符將羅馬字符轉換為整數,所以 XII 將是 (10+1+1)
現在對它們進行排序,但如果 2 個羅馬字符相同,我會比較其附帶的字母表。
const num = ["II-B", "II-A", "I-A", "IV-A", "IV-B"];
num.sort((a, b) => {
const diff = roman_to_Int(a.split("-")[0]) - roman_to_Int(b.split('-')[0]);
if (diff === 0) {
return a.split("-")[1].localeCompare(b.split("-")[1]);
}
return diff;
});
console.log(num);
/* Source - https://www.w3resource.com/javascript-exercises/javascript-math-exercise-22.php */
function roman_to_Int(str1) {
if(str1 == null) return -1;
var num = char_to_int(str1.charAt(0));
var pre, curr;
for(var i = 1; i < str1.length; i++){
curr = char_to_int(str1.charAt(i));
pre = char_to_int(str1.charAt(i-1));
if(curr <= pre){
num += curr;
} else {
num = num - pre*2 + curr;
}
}
return num;
}
function char_to_int(c){
switch (c){
case 'I': return 1;
case 'V': return 5;
case 'X': return 10;
case 'L': return 50;
case 'C': return 100;
case 'D': return 500;
case 'M': return 1000;
default: return -1;
}
}
添加回答
舉報