在javascript中使用特殊字符对数字数据进行排序

Sort Aplhanumeric data with special characters in javascript

本文关键字:数据 数字 排序 特殊字符 javascript      更新时间:2023-09-26
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出现在

之前

是否有一段代码只能对字母数字字符进行排序,而忽略任何特殊字符

是的,使用regex替换来删除所有非字母数字字符很容易:

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);
}
然而,我不认为简单地忽略"特殊"字符是你真正需要的,因为如果你只保留字母数字字符,你会有:
"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);

(我将其更改为使用if/else if/else,以使其比使用几个链式三元操作符更具可读性。)