繁体   English   中英

如何在JavaScript中对字母进行排序,并将大写和小写字母组合在一起?

[英]How do you sort letters in JavaScript, with capital and lowercase letters combined?

我正在研究一个JavaScript(jQuery也可以,如果它需要它,但我怀疑它会)用于按字母顺序排列一串字母。 假设我要排序的字符串是:“ACBacb”。

我现在的代码是这样的:

var string='ACBacb';
alert(string.split('').sort().join(''));

这将返回ABCabc。 我可以看到为什么会发生这种情况,但这不是我要寻找的格式。 有没有办法可以通过将相同的字母放在彼此旁边,首字母大写字母来对其进行排序? 所以当我输入ACBacb时,我得到了AaBbCc?

Array.sort可以将sort函数作为可选参数。

首先对字符串进行排序(ACBacbA变为AABCabc),然后将其排序为不区分大小写:

function case_insensitive_comp(strA, strB) {
    return strA.toLowerCase().localeCompare(strB.toLowerCase());
}

var str = 'ACBacbA';
// split the string in chunks
str = str.split("");
// sorting
str = str.sort();
str = str.sort( case_insensitive_comp )
// concatenate the chunks in one string
str = str.join("");

alert(str);

根据Felix的建议,第一个排序函数可以省略并合并到第二个排序函数中。 首先,对两个字符进行不区分大小写的比较。 如果它们相等,请检查它们区分大小写的等效项。 返回-1或1表示差异,返回0表示相等。

function compare(strA, strB) {
   var icmp = strA.toLowerCase().localeCompare(strB.toLowerCase());
   if (icmp != 0) {
       // spotted a difference when considering the locale
       return icmp;
   }
   // no difference found when considering locale, let's see whether
   // capitalization matters
   if (strA > strB) {
       return 1;
   } else if (strA < strB) {
       return -1;
   } else {
       // the characters are equal.
       return 0;
   }
}
var str = 'ACBacbA';
str = str.split('');
str = str.sort( compare );
str = str.join('');

您可以将自定义比较函数传递给Array.sort()


到目前为止,已经给出的答案是正确的,你必须使用自定义比较功能。 但是,您必须在小写一次之前添加一个额外的步骤来对大写字母进行排序:

function cmp(x,y) {
    if(x.toLowerCase() !== y.toLowerCase()) {
        x = x.toLowerCase();
        y = y.toLowerCase();
    }
    return x > y ? 1 : (x < y ? -1 : 0);
    // or return x.localeCompare(y);
}

如果字母相同,则必须比较原件,而不是小写版本。 大写字母总是比小写字母“大”。

DEMO (基于@Matt Ball的版本)

一个工作示例http://jsfiddle.net/uGwZ3/

var string='ACBacb';
alert(string.split('').sort(caseInsensitiveSort).join(''));

function caseInsensitiveSort(a, b)
{
   var ret = 0;
   a = a.toLowerCase();b = b.toLowerCase();
   if(a > b)
      ret = 1;
   if(a < b)
      ret = -1;
   return ret;
}

另一个替换的基本示例,结合小写:D

 <button onclick="myFunction('U')">Try it</button> <p id="demo"></p> <script> function myFunction(val) { var str = "HELLO WORLD!"; var res = str.toLowerCase().split("o"); var elem = document.getElementById("demo").innerHTML for(i = 0; i < res.length; i++){ (i > 0)?elem += val + res[i]:elem += res[i]; } } </script> 

使用这样的自定义排序函数:

function customSortfunc(a,b){ 
  var lca = a.toLowerCase(), lcb = b.toLowerCase();
   return lca > lcb ? 1 : lca < lcb ? -1 : 0;

}
var string='ACBacb';
alert(string.split('').sort(customSortfunc).join(''));

您可以在此处阅读有关sort函数的更多信息: https//developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

注意 :如果你使用localeCompare像其他答案所示,“u”和“ü”将作为同一个字母排序在一起,因为它忽略了所有的变音符号。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM