我正在开发一个JavaScript(jQuery也可以,如果它需要它,但我怀疑它会)用于按字母顺序排列一串字母。假设我要排序的字符串是:“ACBacb”。
截至目前我的代码是:
var string='ACBacb';
alert(string.split('').sort().join(''));
这将返回ABCabc。我可以看到为什么会发生这种情况,但这不是我要寻找的格式。有没有办法可以通过将相同的字母放在彼此旁边,首字母大写字母来对其进行排序?所以当我输入ACBacb时,我得到了AaBbCc?
答案 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>