我想要对这样的字符串对象进行排序,请问有什么方法?
[code="js"]
var objTEST = [
{AAA:'100%50', BBB:'141', CCC:'2001'},
{AAA:'200%15', BBB:'141', CCC:'2001'},
{AAA:'100%20', BBB:'141', CCC:'2001'},
{AAA:'200%6', BBB:'141', CCC:'2001'},
{AAA:'200%19', BBB:'141', CCC:'2001'},
{AAA:'100%5', BBB:'141', CCC:'2001'}
]
[/code]
排序方式是:对第一列,需要先对%前的字符排序,再对%后的字符排序,排完序后的对象应该是:
[code="js"]
var objTEST = [
{AAA:'100%5', BBB:'141', CCC:'2001'},
{AAA:'100%20', BBB:'141', CCC:'2001'},
{AAA:'100%50', BBB:'141', CCC:'2001'},
{AAA:'200%6', BBB:'141', CCC:'2001'},
{AAA:'200%15', BBB:'141', CCC:'2001'},
{AAA:'200%19', BBB:'141', CCC:'2001'}
]
[/code]
谢谢啦
抱歉我这里总共就30分,全抛啦
先定义一个函数进行数据处理,接下来就是标准的排序了
[code="js"]
var objTEST = [
{AAA:'100%5', BBB:'141', CCC:'2001'},
{AAA:'100%20', BBB:'141', CCC:'2001'},
{AAA:'100%50', BBB:'141', CCC:'2001'},
{AAA:'200%6', BBB:'141', CCC:'2001'},
{AAA:'200%15', BBB:'141', CCC:'2001'},
{AAA:'200%19', BBB:'141', CCC:'2001'}
]
function foo(str){
var d=str.match(/%(\d+)/)[1]||'';
var r='%'+'0000'.slice(0,2-d.length)+d;
return str.replace('%'+d,r);
}
var sort=[],j=0;
for(var i=1;i<objTEST.length;i++){
for(j=0;j<sort.length;j++)
if(foo(objTEST[i].AAA)<foo(sort[j].AAA)){
break;
}
sort=sort.slice(0,j).concat([objTEST[i]],sort.slice(j,sort.length));
}
[/code]
[b]希尔排序[/b]貌似能解决你的问题
var objTEST = [
{AAA:'100%50', BBB:'141', CCC:'2001'},
{AAA:'200%15', BBB:'141', CCC:'2001'},
{AAA:'100%20', BBB:'141', CCC:'2001'},
{AAA:'200%6', BBB:'141', CCC:'2001'},
{AAA:'200%19', BBB:'141', CCC:'2001'},
{AAA:'100%5', BBB:'141', CCC:'2001'}
];
//alert(objTEST);
function sortFilter(element1, element2){
try{
var result = -1;
var t0 = element1.AAA;
var t1 = t0.substring(0,t0.indexOf('%'));
var t2 = t0.substring(t0.indexOf('%')+1,t0.length);
var d0 = element2.AAA;
var d1 = d0.substring(0,d0.indexOf('%'));
var d2 = d0.substring(d0.indexOf('%')+1,d0.length);
t1 = parseInt(t1);
t2 = parseInt(t2);
d1 = parseInt(d1);
d2 = parseInt(d2);
//alert(t0+d0);
if(t0==d0){
result = 0;
}else if(t1>d1){
result = 1;
}else if(t1<d1){
result = -1;
}else{
if(t2>d2){
result = 1;
}else if(t2<d2){
result = -1;
}else{
result = 0;
}
}
}catch(e){
alert(e.message);
result = 0;
}
return result;
}
objTEST.sort(sortFilter);
for(var i=0; i<objTEST.length; i++){
var t0 = objTEST[i].AAA;
alert(t0);
}
:)
楼上的代码写得比较简洁,javascript比较利害啊!
[code="javascript"]
var objTEST = [ {AAA:'100%50', BBB:'141', CCC:'2001'}, {AAA:'200%15', BBB:'141', CCC:'2001'}, {AAA:'100%20', BBB:'141', CCC:'2001'}, {AAA:'200%6', BBB:'141', CCC:'2001'}, {AAA:'200%19', BBB:'141', CCC:'2001'}, {AAA:'100%5', BBB:'141', CCC:'2001'} ]; for( var i = 0; i < objTEST.length; i++) { for( var j = 0; j < objTEST.length - 1; j++) { if(compareStrs(objTEST[j]['AAA'], objTEST[j+1]['AAA']) > 0){ var t = objTEST[j]; objTEST[j] = objTEST[j+1]; objTEST[j+1]=t; } } } function compareStrs(str1, str2) { var part1OfStr1 = Number(str1.substring(0, str1.indexOf("%"))); var part2OfStr1 = Number(str1.substring(str1.indexOf("%") + 1)); var part1OfStr2 = Number(str2.substring(0, str2.indexOf("%"))); var part2OfStr2 = Number(str2.substring(str2.indexOf("%") + 1)); return (part1OfStr1 - part1OfStr2 ) == 0 ? (part2OfStr1 - part2OfStr2 ) : ( part1OfStr1 - part1OfStr2); }[/code]
比较字符串大小的逻辑在comareStrs方法里面定义,就可以根据需求用不同的排序算法了了。