javascript:关注字符串对象高级排序(赠高分)

我想要对这样的字符串对象进行排序,请问有什么方法?
[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方法里面定义,就可以根据需求用不同的排序算法了了。