2017-04-04 286 views
1

我写了一个函数,它使用.sort()方法进行了字母顺序排列。目前,该功能只能使用小写字母。我如何修复这个函数,使大写字母与小写字母相同?例如,C在a之前排序,这没有意义。用大写字母字符串字符串

这里是我的代码:

document.getElementById("btn").addEventListener('click', alphabetize); 
 
    
 
function alphabetize() { 
 
    var output; 
 
    var input = document.getElementById('input').value; 
 
    input = input.split('').sort().join(''); 
 
    output = input; 
 
    document.getElementById('output').value = output; 
 
}
<input type="text" id="input" /><br /> 
 
<input type="text" id="output" /><br /> 
 
    
 
<button id="btn">Alphabetize String </button> 

+1

请添加一些例子作为输入和想要的输出。 –

+0

如果我输入我的名字查理,它会输出:Caehilr – Brixsta

+1

看'sort(compareFunction)' –

回答

2

试试这个:

function alphabetize() { 
    var output; 
    var input = document.getElementById('input').value; 
    input = input.toLowerCase().split('').sort().join(''); 
    output = input; 
    document.getElementById('output').value = output; 
} 

//Input: "Charlie" 
//Output: "acehilr" 

https://jsfiddle.net/fdnnu8Ld/

0

什么你正在试图做的是比较和排序混合大小写字母,但什么样的JavaScript实际上做的是比较这些字母的Unicode代码点值,并将其作为相应的,过于简单化排序,JavaScript的没有按不知道字符是如何相互比较的 - 人脑很容易看到“C”应该出现在“a”后面,但不同字母或甚至非字母符号的字母应该如何相互比较?

转换英文字母字符代码的字母,大写字母AZ由65-90代表和小写字母AZ由97-122表示,这解释了为什么在你的sort(),“C”来了之前的 “a”(67 < 97)。

我们需要做的就是像所有小写字母或全部大写字母一样比较。最简单的方法是在应用sort()但是之前转换您的输入字符串.toLowerCase.toUpperCase,这会导致输出字符串处于单个情况而不是原始输入的混合情况。

的溶液,因此,是在比较期间每个字符转换为相同的情况下,离开原来情况下不变。为此,我们传递一个compareFunctionsort()方法,像这样:

(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 functioncompareFunction,像这样:

{ 
 
    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")); 
 
}

注意:我假定需要执行的任何字符串操作(例如,修剪空白)和检查(例如,零长度字符串,非字母字符)已经是您的代码的一部分。