日期:2014-05-16  浏览次数:20386 次

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