用大写字母对字符串进行字母顺序排列

时间:2017-04-04 19:14:28

标签: javascript html function

我编写了一个使用.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>      

3 个答案:

答案 0 :(得分: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/

答案 1 :(得分:0)

请参阅Array.protoype.sort文档,其中包含示例:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/sort

答案 2 :(得分:0)

你要做的是比较和排序混合大小写的字母,但JavaScript实际上做的是比较这些字母的Unicode代码点值并相应地对它们进行排序,以免过于简单化,JavaScript没有知道人物如何相互比较 - 人类大脑很容易看到这些&#34; C&#34;应该追随&#34; a&#34;但是不同的字母或甚至非字母符号的字母应该如何相互比较?

将英文字母的字母转换为字符代码,大写字母AZ由65-90表示,小写字母az由97-122表示,这解释了为什么,在sort(),&#中34; C&#34;即将到来&#34; a&#34; (67&LT; 97)。

我们需要做的是比较喜欢,全部小写或全部大写字母。最简单的方法是在应用.toLowerCase 之前转换输入字符串.toUpperCasesort(),但这将导致输出字符串的不良结果在一个案例中,而不是在原始输入的混合情况下。

因此,解决方案是在比较期间将每个字符转换为相同的大小写,保持原始情况不变。我们将compareFunction传递给sort()方法,如下所示:

&#13;
&#13;
(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"));
})();
&#13;
&#13;
&#13;

另一种方法是使用localeCompare()比较2个字符而不进行大小写转换,这样可以比较重音字符:

&#13;
&#13;
(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"));
})();
&#13;
&#13;
&#13;

如果ES6是您的选项,您可以使用spread operator将字符串拆分为单独的字母,将arrow function拆分为compareFunction,如下所示:

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

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

相关问题