Javascript按字符串中的字符串排序,并带有分隔符

时间:2012-10-12 18:08:25

标签: javascript sorting

我有一个这样的字符串:

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

基本上这是某种表,其中列名称将由|<br>分隔行进行分隔。

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

谢谢

4 个答案:

答案 0 :(得分:1)

快速解决方案,原谅糟糕的变量名称:

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);

输出:

|AQW12|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW09|2|34|33|12|<br>
|AQW09|2|34|33|12|<br>|AQW11|2|34|33|12|<br>|AQW12|2|34|33|12|<br>

变量l3包含数组形式的数据:

[ [ 'AQW09', '2', '34', '33', '12' ],
  [ 'AQW11', '2', '34', '33', '12' ],
  [ 'AQW12', '2', '34', '33', '12' ] ]

有关localCompare的评论,请参阅https://stackoverflow.com/a/2167619/1689451

当然,你也可以使用方法链,如果你想炫耀:)

var output = allString.split("<br>")
  .map( function(elem) { return elem.split("|"); } )
  .sort( function(a,b) { return a[1].localeCompare(b[1]); } )
  .map( function(elem) { return elem.join("|"); } )
  .join("<br>");

答案 1 :(得分:0)

如果此列始终采用相同的模式,例如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 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>

答案 2 :(得分:0)

可能最简单的方法是将其拆分为数组,对其进行排序并重新组合:

var rows = allString.split("<br>");
//sort...
var sortedString = rows.join("<br>");

JavaScript数组有一个内置的排序方法,它接受一个自定义比较函数,你可以定义它来比较每个字符串中的第二个项目:

function compare(rowA, rowB) {

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

    return rowAcol2.localeCompare(rowBcol2);
}

然后进入排序方法:

rows.sort(compare);

This JSBin shows it all together.

答案 3 :(得分:0)

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>"));