Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript在带有delimeters的字符串中按字符串排序_Javascript_Sorting - Fatal编程技术网

Javascript在带有delimeters的字符串中按字符串排序

Javascript在带有delimeters的字符串中按字符串排序,javascript,sorting,Javascript,Sorting,我有这样一个字符串: var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>"; var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>" var allRows = allString.spl

我有这样一个字符串:

var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>";
var allString  = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>"
var allRows    = allString.split('<br>');
var sortedRows = allRows.sort(function(a,b){ 

  if(a && b ){
      var arrA = a.split('|');
      var arrB = b.split('|');

      return new Number(arrA[1].substr(3,2)) - new Number(arrB[1].substr(3,2));
  }

  return null;
});

var sortedString = sortedRows.join('<br>');

>> |AQW09|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW12|2|34|33|12|<br>
var allString=“|AQW12 | 2 | 34 | 33 | 12 |
AQW11 | 2 | 34 | 12 |
AQW09 | 2 | 34 | 33 |
”;
基本上,这是一种表,其中列名由
|
删除,而

分隔行

我的问题是如何按照第2列(即AQW12、AQW11等)对allString进行排序


如果此列始终采用相同的模式,如3个字母和2个数字(AQW12、AQW11),请向您表示感谢

您可以这样做:

var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>";
var allString  = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>"
var allRows    = allString.split('<br>');
var sortedRows = allRows.sort(function(a,b){ 

  if(a && b ){
      var arrA = a.split('|');
      var arrB = b.split('|');

      return new Number(arrA[1].substr(3,2)) - new Number(arrB[1].substr(3,2));
  }

  return null;
});

var sortedString = sortedRows.join('<br>');

>> |AQW09|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW12|2|34|33|12|<br>
var allString=“|AQW12 | 2 | 34 | 33 | 12 |
AQW11 | 2 | 34 | 12 |
AQW09 | 2 | 34 | 33 |
” var allRows=allString.split(“
”); var sortedRows=allRows.sort(函数(a,b){ 如果(a&b){ var arrA=a.split(“|”); var arrB=b.split(“|”); 返回新编号(arrA[1].substr(3,2))-新编号(arrB[1].substr(3,2)); } 返回null; }); var sortedString=sortedRows.join(“
”); >>| AQW09 | 2 | 34 | 33 | 12 |
AQW11 | 2 | 34 | 33 |
AQW12 | 2 | 34 | 33 |

快速解决方案,请原谅错误的变量名称:

var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>";

var l1 = allString.split("<br>");
var l2 = l1.map( function(elem) { return elem.split("|"); } )
var l3 = l2.sort( function(a,b) { return a[1].localeCompare(b[1]); } )
var l4 = l3.map( function(elem) { return elem.join("|"); } );
var output = l4.join("<br>");
console.log(allString);
console.log(output);
有关
localCompare
的评论,请参阅

当然,如果您想炫耀一下,也可以使用方法链接:)

var输出=allString.split(
”) .map(函数(elem){return elem.split(“|”);}) .sort(函数(a,b){返回a[1].localeCompare(b[1]);}) .map(函数(elem){return elem.join(“|”);}) .加入(“
”);
最简单的方法可能是将其拆分为一个数组,对其进行排序,然后重新组合:

var rows = allString.split("<br>");
//sort...
var sortedString = rows.join("<br>");
然后进入排序方法:

rows.sort(compare);
var allString=“|AQW12 | 2 | 34 | 33 | 12 |
|AQW11 | 2 | 34 | 33 | 12 |
|; ​var arr=allString.split(
); var re=/AQW([\d]+)/; ​arr.sort(函数(a,b){ 如果(!(a&b))返回-1; x=a.split(“|”)[1]; y=b.split(“|”)[1]; 返回(parseInt(x.match(re)[1])-parseInt(y.match(re)[1]); }); console.log(arr.join(“
”);
我实现了这个想法,并且在我回到这里之前就成功了。谢谢。对不起,我不能同意。我发现这很难理解,而且它比更简单的版本要慢得多:(给它大约8秒的执行时间)。谢谢你的基准测试!有趣!但是:鲁道夫:3100,汤姆:3371。(Chromium 18.0.1025.168)汤姆:6618,鲁道夫:4304(Node.js 0.4.9)汤姆:12642,鲁道夫:15042(Firefox 15)。真有趣!关于可读性,我认为这取决于你是否习惯于函数式编程。有些人认为Lisp很难阅读;
function compare(rowA, rowB) {

    var rowAcol2 = rowA.split("|")[1];
    var rowBcol2 = rowB.split("|")[1];

    return rowAcol2.localeCompare(rowBcol2);
}
rows.sort(compare);
var allString = "|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>";

​var arr = allString.split("<br>");

var re=/AQW([\d]+)/;
​arr.sort(function(a,b){
    if(!(a && b)) return -1;
    x=a.split("|")[1];
    y=b.split("|")[1];

    return(parseInt(x.match(re)[1]) - parseInt(y.match(re)[1]));
});

console.log(arr.join("<br>"));