首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > JavaScript >

关于JSON的排序有关问题

2013-07-09 
关于JSON的排序问题var str {张三: 85, 李四: 88, 王五: 79} //AJAX从后端获得的字符串,并非直

关于JSON的排序问题
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}

搞半天没有想到好办法,自己拆解去冒泡倒是可以,但感觉太山寨,有什么好方法么?
谢谢大家。
[解决办法]

<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>

[解决办法]
先转换成数组,sort()方法排序,再转换回对象

[解决办法]
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方法内部实现是快排,效率不是问题。
------解决方案--------------------


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

热点排行