[英]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.