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