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