2012-10-12 99 views
2

我有一個這樣的字符串:的Javascript排序與定界符字符串中的字符串

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

基本上這是某種形式的表,其中列名會被|被delimetered和<br>界定行。

我的問題是你如何去排序列2(即AQW12,AQW11等)的allString。

謝謝

回答

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

很清晰,乾淨。謝謝 – mpora

+0

對不起,但我不同意。我發現這很難閱讀,並且比更簡單的版本慢得多:http://jsbin.com/epuvew/2/edit(給它大約8秒執行)。 –

+0

感謝您的基準!有趣!但是:rudolf:3100,tom:3371.(Chromium 18.0.1025.168) –

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> 

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.

+0

我實現了這個想法,並且在我回到這裏之前它就起作用了。謝謝。 – mpora

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