2012年9月3日 星期一

javascript JSON 排序

排序這需求不用多說,今天來玩玩

值得一提的是這個排序是從之前的筆記中學來的

http://weisnote.blogspot.tw/2012/02/listbox.html

現在看看以前還真可愛 雖然是上課作業要用泛型克服 ListBox Sort 字串 排列會有問題

但是其實我做了兩次型別的判斷 真是多餘 =3=

重點在於這個排序法是從 MSDN 上學到的

http://msdn.microsoft.com/zh-tw/library/system.windows.forms.listbox.sort.aspx

應該是快速排序法吧

相較於一般很乖的用兩個 for 迴圈 跑半天

他直接使用兩個 while 來進行

每次走訪兩兩比較 並把大值前移

直到無值被交換 則排序結束

這也是少數用到 do while 迴圈的寫法 我喜歡



不說廢話 來看code

javascript 沒泛型 而且沒那麼嚴謹 只需要注意 是否為數值排序

如果以字串排序 "9","7","13","17" 會因為字首1 變成 "13","17","7","9"



2013/1/12 修正版

上面的 swap() 其實有蟲呀 而且是大肥蟲 ZZ

不解釋 順便包成 JQuery 版



(function ($) {
    $.parseJsonAndSort = function (jsonStr, field, isNumber) {
        var jsonObj = $.parseJSON(jsonStr);
        var counter = $(jsonObj).size() - 1;
        var swapped;
        var swap = function () {
            var tmp = jsonObj[counter];
            jsonObj[counter] = jsonObj[counter - 1];
            jsonObj[counter - 1] = tmp;
            swapped = true;
        };
        do {
            swapped = false;
            while (counter > 0) {
                if (isNumber) {
                    var a = parseInt(jsonObj[counter][field], 10);
                    var b = parseInt(jsonObj[counter - 1][field], 10);
                    if (parseInt(jsonObj[counter][field], 10) < parseInt(jsonObj[counter - 1][field], 10)) {
                        swap();
                    }
                } else {
                    if (jsonObj[counter][field] < jsonObj[counter - 1][field]) {
                        swap();
                    }
                }
                counter--;
            }
        } while (swapped);
        return jsonObj;
    };
})(jQuery);

沒有留言:

張貼留言