var str = "{"张三": 85, "李四": 88, "王五": 79}"; //AJAX从后端获得的字符串,并非直接赋值//这是一个成绩单,我一般情况下采用eval变成json对象,然后采用for in展现
jsonObj = eval( "(" + str + ")" );
for (var name int jsonObj)
{
   alert(name + "考了" + jsonObj[name] + "分");
}以上是我的应用场景,代码是我随手写的,只是表达意思而已,突然老板心血来潮,说要搞个排序,让高分的排前面。
也就是要变成:
{"李四": 88, "张三": 85, "王五": 79}搞半天没有想到好办法,自己拆解去冒泡倒是可以,但感觉太山寨,有什么好方法么?
谢谢大家。

解决方案 »

  1.   

    老大要排序后台生成时就排一下喽,sql排序输出多方便呀。
      

  2.   

    <script type="text/javascript">
        var str = '{"张三": 85,"李四": 88,"王五": 79}';
        var jsonObj = eval( "(" + str + ")" );
        var newObj={},arr=[];
        for (var name in jsonObj){
            arr.push(jsonObj[name]+"_"+name);
        }
        arr.sort(function compare(a,b){return parseInt(b)-parseInt(a)});
        for(var i=0;i<arr.length;i++){
            var temp=arr[i].split("_");
            newObj[temp[1]]=temp[0];
        }
        alert(newObj);
    </script>
      

  3.   

    先转换成数组,sort()方法排序,再转换回对象
      

  4.   

    sql里的order by是干什么的?让后端从数据库里查的时候排序不比你传到前端来排序高效。另外,就算要前端js来排序,你这个json格式排不了序的亲,用for in遍历obj的属性是按属性的字典序输出的,无论你怎么排都没用。要把这个json格式改成最外层是[],即array型。var str = '[{"name":"张三","score" :85}, {"name":"李四", "score":88}, {"name":"王五","score": 79}]'; //这是一个成绩单,我一般情况下采用eval变成json对象,然后采用for in展现
    jsonObj = eval( "(" + str + ")" );
    jsonObj.sort(function(a,b){ return b.score - a.score;});sort方法内部实现是快排,效率不是问题。
      

  5.   


    汗第二句话是问号,劝lz叫后端的直接在数据库order by吧,或者后端序言sort完了之后再返回给js。
      

  6.   

    function createComparisonFunction(propertyName) {  
          
        return function(object1, object2) { 
            var value1,value2; 
            for(var i in object1) {
              value1 = object1[i]
            }
            for(var i in object2) {
              value2 = object2[i]
            }        
      
            if(value1 < value2) {  
                return -1;  
            } else if (value1 > value2) {  
                return 1;  
            } else {  
                return 0;  
            }  
        };  
    }  var str = "{"张三": 85, "李四": 88, "王五": 79}"; 
    var objstr = evel('(' + str + ')');
    var arrstr = [];
    $.each(objstr, function(i, dom) {
      var obj = {};
      obj[i] = dom;
      arr.push(obj);
    });
    arrstr.sort(createComparisonFunction());  
    for(var i=0,j=arrobj.length; i<j; i++) {
      $.extend(objstr, arrobj[i]);
    }alert(arrstr);
      

  7.   

    function createComparisonFunction() {  
           
        return function(object1, object2) { 
            var value1,value2; 
            for(var i in object1) {
              value1 = object1[i]
            }
            for(var i in object2) {
              value2 = object2[i]
            }        
       
            if(value1 < value2) {  
                return -1;  
            } else if (value1 > value2) {  
                return 1;  
            } else {  
                return 0;  
            }  
        };  
    }  
     
    var str = "{"张三": 85, "李四": 88, "王五": 79}"; 
    var objstr = evel('(' + str + ')');
    var arrstr = [];
    $.each(objstr, function(i, dom) {
      var obj = {};
      obj[i] = dom;
      arr.push(obj);
    });
    arrstr.sort(createComparisonFunction());  
    for(var i=0,j=arrobj.length; i<j; i++) {
      $.extend(objstr, arrobj[i]);
    }
     
    alert(arrstr);
      

  8.   

        var str = '{"张三": 85,"李四": 88,"王五": 79}';
        var jsonObj = eval( "(" + str + ")" );
        var arr=[];
        for (var name in jsonObj) arr.push({"name":name,"value":jsonObj[name]});
        arr.sort(function compare(a,b){return b.value-a.value});
        var jsonObj = {};
        for(var i=0;i<arr.length;i++) jsonObj[arr[i].name] = arr[i].value;
      

  9.   


        var jsonObj = {};
        for(var i=0;i<arr.length;i++) jsonObj[arr[i].name] = arr[i].value;这个var jsonObj = {};那放进jsonObj的就成了jsonObj的属性,属性貌似没有顺序可言吧,就算用for in遍历,这里的顺序其实有坑的,不单纯是按照放进去的顺序。
      

  10.   

    属性有顺序可言,他的顺序就是放进去的顺序。但在实际应用中,并不需要 for(var i=0;i<arr.length;i++) jsonObj[arr[i].name] = arr[i].value; 这一步
    因为排序后的对象数组,已经满足了使用的需要了
      

  11.   

    #9正解
    #2也不错 蛋有问题(parseInt估计都isNaN)而且效率必然没#9高的哦
      

  12.   

    一样的逻辑。就算出现NaN并不影响计算。至于效率应该差不多,详细的需要你增大数据量来测试比较才知道。