猿问

在 JavaScript 中排序罗马数字

我在 javascript 中有一个函数,其中它schoolClass是一个像这样的罗马数字I,等等II。IV这个函数被多次调用,结果它连接在一个数组中,如下所示:


const generateClasses = (schoolClass, number) => {

  const classes = [];


  for (let i = 0; i < number; i++) {

    classes.push(`${schoolClass}-${(i + 10).toString(36).toUpperCase()}`);

  }

  return classes;

};

let output = [];

output = output.concat(generateClasses('II', 2));

output = output.concat(generateClasses('I', 1));

output = output.concat(generateClasses('IV', 2));

console.log(output);

最后输出是这样的:

["II-A", "II-B", "I-A", "IV-A", "IV-B"]

如何像数组一样排序["I-A", "II-A", "II-B", "IV-A", "IV-V"] 我感谢任何帮助!PS:为了转换罗马数字,我使用该roman-numbers模块


狐的传说
浏览 150回答 3
3回答

DIEA

您需要将罗马数字转换为普通(阿拉伯)数字进行比较。由于罗马数字的数量非常有限,最简单的方法就是对它们进行硬编码 - 如果您只有 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);

一只名叫tom的猫

由于学校成绩仅限于 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);

MM们

这里我通过迭代每个罗马字符将罗马字符转换为整数,所以 XII 将是 (10+1+1)现在对它们进行排序,但如果 2 个罗马字符相同,我会比较其附带的字母表。const num = ["II-B", "II-A", "I-A", "IV-A", "IV-B"];num.sort((a, b) => {&nbsp; const diff = roman_to_Int(a.split("-")[0]) - roman_to_Int(b.split('-')[0]);&nbsp; if (diff === 0) {&nbsp; &nbsp; return a.split("-")[1].localeCompare(b.split("-")[1]);&nbsp; }&nbsp; return diff;});console.log(num);/* Source - https://www.w3resource.com/javascript-exercises/javascript-math-exercise-22.php */function roman_to_Int(str1) {&nbsp; if(str1 == null) return -1;&nbsp; var num = char_to_int(str1.charAt(0));&nbsp; var pre, curr;&nbsp; for(var i = 1; i < str1.length; i++){&nbsp; &nbsp; curr = char_to_int(str1.charAt(i));&nbsp; &nbsp; pre = char_to_int(str1.charAt(i-1));&nbsp; &nbsp; if(curr <= pre){&nbsp; &nbsp; &nbsp; num += curr;&nbsp; &nbsp; } else {&nbsp; &nbsp; &nbsp; num = num - pre*2 + curr;&nbsp; &nbsp; }&nbsp; }&nbsp; return num;}function char_to_int(c){&nbsp; &nbsp; switch (c){&nbsp; &nbsp; &nbsp; case 'I': return 1;&nbsp; &nbsp; &nbsp; case 'V': return 5;&nbsp; &nbsp; &nbsp; case 'X': return 10;&nbsp; &nbsp; &nbsp; case 'L': return 50;&nbsp; &nbsp; &nbsp; case 'C': return 100;&nbsp; &nbsp; &nbsp; case 'D': return 500;&nbsp; &nbsp; &nbsp; case 'M': return 1000;&nbsp; &nbsp; &nbsp; default: return -1;&nbsp; &nbsp; }}
随时随地看视频慕课网APP

相关分类

JavaScript
我要回答