我有一個這樣的字符串:的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。
謝謝
我有一個這樣的字符串:的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。
謝謝
快速的解決方案,請原諒壞的變量名:
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>");
如果此列總是在相同的模式,比如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>
可能最簡單的方法是將其分成數組,排序並重新組合:
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);
我實現了這個想法,並且在我回到這裏之前它就起作用了。謝謝。 – mpora
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>"));
很清晰,乾淨。謝謝 – mpora
對不起,但我不同意。我發現這很難閱讀,並且比更簡單的版本慢得多:http://jsbin.com/epuvew/2/edit(給它大約8秒執行)。 –
感謝您的基準!有趣!但是:rudolf:3100,tom:3371.(Chromium 18.0.1025.168) –