Javascript-форум (https://javascript.ru/forum/)
-   jQuery (https://javascript.ru/forum/jquery/)
-   -   Сортировка JSON данных в цикле (https://javascript.ru/forum/jquery/36325-sortirovka-json-dannykh-v-cikle.html)

Fareastaz 12.03.2013 07:30

Сортировка JSON данных в цикле
 
Здравствуйте,
У меня к вам пару вопросов
Первый:
подскажите пожалуйста как отсортировать данные получаемые с JSON файла.
Мне нужно отсортировать по ключу "v" - от большего к меньшему.
Файл имеет довольно глубокую вложенность , ссылка с урока http://beta.javascript.ru/task/sortirovka-obektov не помогла из-за немного другой структуры файла.

Структура JSON файла:

[
   {
      "reg":"Peoria, AZ",
      "bids":[
         {
            "ind":"Financial/Credit Card",
            "v":"5.01"
         },
         {
            "ind":"Telecom",
            "v":"1.53"
         },
         {
            "ind":"Retail/Personal Care & Cosmetics",
            "v":"0.76"
         }
      ],
      "lat":"33.5695",
      "lng":"-112.246",
      "t":"20124241446054"
   },
   {
      "reg":"Cottage Grove, WI",
      "bids":[
         {
            "ind":"Retail/Consumer Electronics",
            "v":"7.00"
         },
         {
            "ind":"Telecom",
            "v":"2.52"
         }
      ],
      "lat":"43.0707",
      "lng":"-89.1983",
      "t":"20124241446055"
   },
   {
      "reg":"Ft Lee, CT",
      "bids":[
         {
            "ind":"Financial/Investing",
            "v":"89.98"
         },
         {
            "ind":"Auto/Dealers",
            "v":"12.01"
         },
         {
            "ind":"Travel/Lodging",
            "v":"1.72"
         }
      ],
      "lat":"40.8514",
      "lng":"-73.9758",
      "t":"20124241446056"
   }
   ]


Сами данные формирую так:

<body>

    <div id="content_btn"><input type=button class="btn" value="pause" onclick="continue_reporting = ( continue_reporting == 1 ) ? 0 : 1;">
    <div id="content">
        <div id="table-wrapper"></div>
    </div>


    <script type="text/javascript">        
        
        //Global Variables        
        var continue_reporting = 1;        
        var bids_displayed = 5;
        var uls;
        var data;
        var counter = 0;
        var total_number;
      
      // initial run
      $(document).ready(function(){
          fetch_data(); 
        });
        
        //Processing Data from fetch data function 
        function process_data(data){
          var delay_entry = 0;
          $.each(data, function(key, value){
            setTimeout(function(){pusher(value)}, 800 * delay_entry);
            delay_entry++;
            total_number = data.length;
          })
        }
        
        //Getting Data from JSON File
        function fetch_data(){
            var url = 'js/list.json';
            $.ajax({
                url: url,
                cache: false,
                dataType: 'json',
                data: data,
                success: process_data
              });
          }
        
        //Outputing Data into tables  
        function pusher(data){
            if ( continue_reporting == 1 ){
                var main_ul = "<table cellspacing='0' class='bid_table'>";
                main_ul += "<thead><tr><th class='empty'>&nbsp;</th><th class='city'>" + data.reg + "</th><th class='bid'>Bid</th></tr></thead>";
                for( var i = 0; i < data.bids.length; i++ ){
                    //Strip off everything after "/"
                    var industry = data.bids[i].ind;
                    var strip_industry = industry.split('/')[0];
                    //Aplying style for table row
                    if( i != data.bids.length -1 ){
                            main_ul += "<tbody><tr class='row'><td class ='pic'><img src='img/" + strip_industry + ".png' alt='image'></td><td class='industry'>" + strip_industry + "</td><td class='bid_price'>" + data.bids[i].v + "</td></tr></tbody>"
                        } else {
                        main_ul += "<tbody><tr class='row-last'><td class ='pic'><img src='img/" + strip_industry + ".png' alt='image'></td><td class='industry'>" + strip_industry + "</td><td class='bid_price'>" + data.bids[i].v + "</td></tr></tbody>"
                        }               
                        
                } //End FOR loop
                main_ul += "</table>";
                $(main_ul).prependTo("#content").hide().fadeIn("slow");
                counter++
                
                if(counter == total_number ){
                    fetch_data();
                    counter = 0;
                } 
                    uls = $("#content").children();
                    //Counting elements and substracting last one                                      
                    if (uls.length>100){
                      $(uls.get(uls.length-1)).remove();
                
                      }

            } // END IF STATEMENT STATEMENT
                        
        } // END of PUSHER FUNCTION
    
    //Changing Play/Pause Button
    $("input[type='button']").toggle(
        function(){
            $(this).val("Play").toggleClass("pause");
        },
        function(){
            $(this).val("Pause").toggleClass("pause");
        }
    );

    </script>
      


</body>

Как я понимаю в функции pusher нужно создать массив и дополнительный цикл по которому и сортировать данные по ключу "v" и выводить это в таблицы. Подскажите как именно?

Второй вопрос: каким образом можно организовать правильную паузу вывода данных. В данный момент использую функцию которая флаг continue_reporting в положение 1 или 0 и подключаю ее на кнопку pause. Возникает очень интересная ситуация: пауза срабатывает если нажать на кнопку данные останавливаются , если нажать повторно данные выводятся дальше..Казалось бы все работает но стоит в режиме паузы повисеть несколько минут клавиша становится неработоспособной. Скрипт просто перестает реагировать на нажатие паузы и замерзает. Проверяю логи на количество проходов замерзает всегда на разных элементах массива. Каким образом можно это исправить?

skynet-mfd 13.03.2013 14:32

Такой код перестал жрать ресурсы браузера то?

Fareastaz 14.03.2013 05:51

Спасибо конечно что спросил, код жрать память перестал благодаря разбивки на несколько функций и немного измененной логике.. Вот сейчас только с паузой и сортировкой кто бы подсказал. Знатоки вы где?

skynet-mfd 14.03.2013 10:11

а на стороне сервера это сделать нельзя?

skynet-mfd 14.03.2013 10:11

я про сортировку по ключу v

skynet-mfd 14.03.2013 11:25

Попробуй так...
var your_json;
$.each(your_json, function(index,obj){    
     $.each(obj.bids, function(index,bids){    
               bids.sort(function(bids1,bids2){return bids2.v > bids1.v});
     });          
});

Fareastaz 15.03.2013 07:47

Цитата:

Сообщение от skynet-mfd (Сообщение 240652)
Попробуй так...
var your_json;
$.each(your_json, function(index,obj){    
     $.each(obj.bids, function(index,bids){    
               bids.sort(function(bids1,bids2){return bids2.v > bids1.v});
     });          
});

Логично было бы конечно отсортировать на сервере до отсылки клиенту, должно быть намного быстрее но хочу проверить оба варианта если возможно. Скажи пожалуйста, я не совсем разобрался в какое место мне вставить твой код,. Я формирую данные тремя функциями: fetch_data() -вынимаю из файла данные, передаю в process_data где данные выступают параметром и дальше от нее передаю в функцию pusher . На каком участке их сортировать твоей функцией, можешь показать в коде?

skynet-mfd 15.03.2013 15:13

ну например в строке 26

skynet-mfd 15.03.2013 15:14

function process_data(data){
          var delay_entry = 0;
          $.each(data, function(index,obj){    
               $.each(obj.bids, function(index,bids){    
                     bids.sort(function(bids1,bids2){return bids2.v > bids1.v});
               });          
          });
          $.each(data, function(key, value){
            setTimeout(function(){pusher(value)}, 800 * delay_entry);
            delay_entry++;
            total_number = data.length;
          })
        }

Fareastaz 15.03.2013 18:49

Вставил туда где ты посоветовал, вывод данных сразу прекратился консоль выдает ошибку:
Uncaught TypeError: Object #<Object> has no method 'sort'


Часовой пояс GMT +3, время: 07:24.