【问题标题】:Javascript sort by a string in a string with delimetersJavascript按带有分隔符的字符串中的字符串排序
【发布时间】:2012-10-03 14:30:38
【问题描述】:

我有一个这样的字符串:

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

基本上这是某种表格,其中列名将由| 分隔,&lt;br&gt; 分隔行。

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

谢谢

【问题讨论】:

    标签: javascript sorting


    【解决方案1】:

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

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

      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上的cmets,请参考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>");
      

      【讨论】:

      • 我很抱歉,但我不得不不同意。我发现它很难阅读,而且比更简单的版本要慢得多:jsbin.com/epuvew/2/edit(给它大约 8 秒的时间来执行)。
      • 感谢基准测试!有趣的!但是:鲁道夫:3100,汤姆:3371。(铬 18.0.1025.168)
      • 汤姆:6618,鲁道夫:4304(Node.js 0.4.9)
      • 汤姆:12642,鲁道夫:15042(Firefox 15)。真的很有趣!
      • 关于可读性,我认为这取决于你是否习惯函数式编程。有些人认为 lisp 难以阅读;)
      【解决方案3】:

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

      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.

      【讨论】:

      • 我实现了这个想法,并且在我回到这里之前它已经奏效了。谢谢。
      【解决方案4】:
      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>"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-28
        • 1970-01-01
        相关资源
        最近更新 更多