什么你正在试图做的是比较和排序混合大小写字母,但什么样的JavaScript实际上做的是比较这些字母的Unicode代码点值,并将其作为相应的,过于简单化排序,JavaScript的没有按不知道字符是如何相互比较的 - 人脑很容易看到“C”应该出现在“a”后面,但不同字母或甚至非字母符号的字母应该如何相互比较?
转换英文字母字符代码的字母,大写字母AZ由65-90代表和小写字母AZ由97-122表示,这解释了为什么在你的sort()
,“C”来了之前的 “a”(67 < 97)。
我们需要做的就是像所有小写字母或全部大写字母一样比较。最简单的方法是在应用sort()
但是之前转换您的输入字符串.toLowerCase
或.toUpperCase
,这会导致输出字符串处于单个情况而不是原始输入的混合情况。
的溶液,因此,是在比较期间每个字符转换为相同的情况下,离开原来情况下不变。为此,我们传递一个compareFunction
到sort()
方法,像这样:
(function(){
var output=function(input){
return input.split("").sort(function(a,b){
return a.toLowerCase()>b.toLowerCase();
}).join("");
};
console.log(output("Charlie"));
console.log(output("Shaggy"));
})();
的另一种方法是使用localeCompare()
到2个字符不大小写转换,它具有额外的好处比较是能够比较重音符号:
(function(){
var output=function(input){
return input.split("").sort(function(a,b){
return a.localeCompare(b);
}).join("");
};
console.log(output("Charlie"));
console.log(output("Shaggy"));
})();
如果ES6是你的选择,你可以使用spread operator分割字符串转换成单个字母和arrow function为compareFunction
,像这样:
{
const output=input=>[...input].sort((a,b)=>a.toLowerCase()>b.toLowerCase()).join("");
/*ALTERNATIVES*/
//const output=([...input])=>input.sort((a,b)=>a.localeCompare(b)).join("");
//const output=input=>input.split``.sort((a,b)=>a.localeCompare(b)).join("");
console.log(output("Charlie"));
console.log(output("Shaggy"));
}
注意:我假定需要执行的任何字符串操作(例如,修剪空白)和检查(例如,零长度字符串,非字母字符)已经是您的代码的一部分。
请添加一些例子作为输入和想要的输出。 –
如果我输入我的名字查理,它会输出:Caehilr – Brixsta
看'sort(compareFunction)' –