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

时间:2011-03-12 22:41:05

标签: javascript jquery

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

截至目前我的代码是:

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

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

5 个答案:

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

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

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('');

答案 1 :(得分: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);
}

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

DEMO(基于@Matt Ball的版本)

答案 2 :(得分:1)

一个工作示例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;
}

答案 3 :(得分:0)

使用这样的自定义排序功能:

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(''));

您可以在此处详细了解排序功能:https://developer.mozilla.org/en/JavaScript/Reference/Global_Objects/Array/sort

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

答案 4 :(得分:0)

另一个替换的基本示例,结合小写: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>