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

Zak*_*Zak 18 javascript jquery

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

我现在的代码是这样的:

var string='ACBacb';
alert(string.split('').sort().join(''));
Run Code Online (Sandbox Code Playgroud)

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

Lek*_*eyn 26

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);
Run Code Online (Sandbox Code Playgroud)

根据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('');
Run Code Online (Sandbox Code Playgroud)

  • 当孩子需要注意时,无法回答.尼斯. (2认同)
  • 没有功能是完美的.我的排序功能将`ACBacbAäÁ`转换为`AAaÁäBbCc`,你的排序函数将在其中生成`AaABbCcÁä`. (2认同)

Fel*_*ing 6

您可以将自定义比较功能传递给 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);
}
Run Code Online (Sandbox Code Playgroud)

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

DEMO(基于 @Matt Ball的版本)