DATA = ["Ge_total_EN394" , "p1@5end_chr2:191878874..191878938,-" , "p23@5end_chr2:191839657..191839662,-" , "p2@5end_chr2:191878812..191878823,-"]
我想按升序对数据进行排序。我目前正在使用的功能是关注
function sort(s1, s2) {
var s1lower = s1.toLowerCase();
var s2lower = s2.toLowerCase();
return s1lower > s2lower? 1 : (s1lower < s2lower? -1 : 0);
}
然而这给了我以下输出
"Ge_total_EN394" , "p1@5end_chr2:191878874..191878938,-" , "p23@5end_chr2:191839657..191839662,-" , "p2@5end_chr2:191878812..191878823,-"
p23位于p2之前,这是不正确的。我不确定如何正确排序数据,以便p2出现在
之前答案 0 :(得分:1)
是否有一段代码只能对字母数字字符进行排序并忽略任何特殊字符
是的,使用正则表达式替换以删除所有非字母数字字符很容易:
function sort(s1, s2) {
var s1lower = s1.toLowerCase().replace(/[^a-z0-9]/g, "");
var s2lower = s2.toLowerCase().replace(/[^a-z0-9]/g, "");
return s1lower > s2lower? 1 : (s1lower < s2lower? -1 : 0);
}
但是,我并不认为只是忽视了特殊的&#34;字符是你真正需要的,因为如果你只保留你所拥有的字母数字字符:
"p235endchr2191839657191839662" // originally "p23@..."
"p25endchr2191878812191878823" // originally "p2@..."
...所以p23
项仍然会出现在p2
项目之前。
您似乎真正想要的是,如果有一个@
符号,则按@
之前的部分排序,所以可能类似于:
function sort(s1, s2) {
var s1lower = s1.toLowerCase().split("@");
var s2lower = s2.toLowerCase().split("@");
if (s1lower[0] > s2lower[0])
return 1;
else if (s1lower[0] < s2lower[0])
return -1;
else
return s1lower[1] > s2lower[1] ? 1 : s1lower[1] < s2lower[1] ? -1 : 0;
}
DATA = ["Ge_total_EN394" , "p1@5end_chr2:191878874..191878938,-" , "p23@5end_chr2:191839657..191839662,-" , "p2@5end_chr2:191878812..191878823,-", "p23@1end_chr2:191878812..191878823,-"];
DATA.sort(sort);
console.log(DATA);
&#13;
(我已将其更改为使用if / else if / else使其比几个链式三元运算符更具可读性。)