Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用javascript对皇室姓名进行排序_Javascript_Arrays_Sorting - Fatal编程技术网

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

使用javascript对皇室姓名进行排序,javascript,arrays,sorting,Javascript,Arrays,Sorting,我想把皇室的名字分类。优先选择字母表。如果两个名字相同,那么我想按罗马数字排序。 例如,如果输入为:King III、King II、Queen IX(由于前两个字符串相同,它们需要按附加的罗马数字排序) 所以预期产出:国王二世,国王三世,女王九世 我尝试将罗马数字存储在hashmap中,并编写一个函数,将给定数组中的罗马数字替换为King 2、King 3、Queen 9,然后尝试排序,但未能正确实现。 谁能帮我一下吗? 函数罗马音(罗马){ if(roman==“”)返回0; if(roma

我想把皇室的名字分类。优先选择字母表。如果两个名字相同,那么我想按罗马数字排序。 例如,如果输入为:King III、King II、Queen IX(由于前两个字符串相同,它们需要按附加的罗马数字排序) 所以预期产出:国王二世,国王三世,女王九世

我尝试将罗马数字存储在hashmap中,并编写一个函数,将给定数组中的罗马数字替换为King 2、King 3、Queen 9,然后尝试排序,但未能正确实现。 谁能帮我一下吗?

函数罗马音(罗马){
if(roman==“”)返回0;
if(roman.startsWith(“L”))返回50+罗马顿(roman.substr(1));
if(roman.startsWith(“XL”))返回40+romanToNum(roman.substr(2));
if(roman.startsWith(“X”))返回10+romanToNum(roman.substr(1));
if(roman.startsWith(“IX”))返回9+romanToNum(roman.substr(2));
if(roman.startsWith(“V”))返回5+romanToNum(roman.substr(1));
if(roman.startsWith(“IV”))返回4+romanToNum(roman.substr(2));
if(roman.startsWith(“I”)返回1+romanToNum(roman.substr(1));
返回0;
}
console.log(
[“国王三世”、“国王二世”、“女王九世”]
.map((n)=>({name:n,num:romanToNum(n.split(“”.pop())}))
.sort((a,b)=>(a.num-b.num))
.map(({name,num})=>name)

);您可以拆分字符串并使用,同时将其中的每个元素与另一个元素的每个元素进行比较。如果两个元素都是数字,则取差值,否则返回
localeCompare
的结果

功能自定义排序(数据、顺序){
函数isNumber(v){
return(+v).toString()==v;
}
职能以色列阿曼(s){
// http://stackoverflow.com/a/267405/1447675
return/^M{0,4}(CM|CD|D?C{0,3})(XC|XL|L?X{0,3})(IX | IV | V?I{0,3})$/I.test(s);
}
功能分析程序(s){
var val={M:1000,D:500,C:100,L:50,X:10,V:5,I:1};
返回s.toUpperCase().split(“”).reduce(函数(r,a,i,aa){
返回val[a]

。作为控制台包装{max height:100%!important;top:0;}
使用您自己的转换表获取罗马数字的十进制值, 而不是使用正确的回调进行简单排序

var romanNumberToDec = {
  "I" : 1, "II" : 2, "III" : 3, "IV" : 4, "V" : 5,
  "VI" : 6, "VII" : 7, "VIII" : 8, "IX" : 9, "X" : 10
}
和桌子在一起

如果这就是你需要处理的一切

但是如果你需要一个更通用的方法--

函数fromroam(str){
var结果=0;
//结果现在是一个数字,而不是字符串
var decimal=[1000900500400100,90,50,40,10,9,5,4,1];
var roman=[“M”、“CM”、“D”、“CD”、“C”、“XC”、“L”、“XL”、“X”、“IX”、“V”、“IV”、“I”];
对于(var i=0;i{
设aNum=a.substr(a.lastIndexOf(“”+1,a.length);
设bNum=b.substr(b.lastIndexOf(“”+1,b.length);
//返回romanumbertodec[aNum]-romanumbertodec[bNum];
从罗马(aNum)返回-从罗马(bNum)返回;
});
控制台日志(arrayObj);
};
mySort();

通用方法

您是否进行了研究或已经尝试了什么?
function fromRoman(str) {  
   var result = 0;
   // the result is now a number, not a string
   var decimal = [1000, 900, 500, 400, 100, 90, 50, 40, 10, 9, 5, 4, 1];
   var roman = ["M", "CM","D","CD","C", "XC", "L", "XL", "X","IX","V","IV","I"];
   for (var i = 0;i<=decimal.length;i++) {
       while (str.indexOf(roman[i]) === 0){
         result += decimal[i];
         str = str.replace(roman[i],'');
       }
   }
   return result;
}


var arrayObj = [ "King III", "King II", "Queen IX"];

function mySort() {
    arrayObj.sort( (a, b)=> {
      let aNum = a.substr(a.lastIndexOf(" ") + 1, a.length);
      let bNum = b.substr(b.lastIndexOf(" ") + 1, b.length);
      // return romanNumberToDec[aNum] - romanNumberToDec[bNum]; 
      return fromRoman(aNum) - fromRoman(bNum);
    });
    console.log(arrayObj);
};

mySort();