使用 javascript 对皇室名称进行排序

Sai*_*ai -1 javascript arrays sorting

我想对皇室名字进行排序。对字母表的第一偏好。如果两个名字相同,那么我想按罗马数字排序。例如,如果输入是:King III、King II、Queen IX。(因为 1st 2 个字符串相同,它们需要按附加的罗马数字排序)所以预期输出:King II、King III、Queen IX。

我尝试将罗马数字存储在哈希图中并编写一个函数,将给定数组中的罗马数字替换为 King 2、King 3、Queen 9,然后尝试排序但无法正确实现。任何人都可以帮助我吗?

Aur*_*ílý 5

function romanToNum(roman) {
  if (roman === "")           return 0;
  if (roman.startsWith("L"))  return 50 + romanToNum(roman.substr(1));
  if (roman.startsWith("XL")) return 40 + romanToNum(roman.substr(2));
  if (roman.startsWith("X"))  return 10 + romanToNum(roman.substr(1));
  if (roman.startsWith("IX")) return 9  + romanToNum(roman.substr(2));
  if (roman.startsWith("V"))  return 5  + romanToNum(roman.substr(1));
  if (roman.startsWith("IV")) return 4  + romanToNum(roman.substr(2));
  if (roman.startsWith("I"))  return 1  + romanToNum(roman.substr(1));
  return 0;
}
console.log(
    ["King III", "King II", "Queen IX"]
      .map((n) => ({name: n, num: romanToNum(n.split(" ").pop())}))
      .sort((a, b) => (a.num - b.num))
      .map(({name, num}) => name)
  );
Run Code Online (Sandbox Code Playgroud)

romanToNum功能改编自这个答案。数组首先映射到{name, num}对象,然后按 排序num,然后name仅转换回s。