Показать сообщение отдельно
  #1 (permalink)  
Старый 12.03.2013, 07:30
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

Сортировка 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. Возникает очень интересная ситуация: пауза срабатывает если нажать на кнопку данные останавливаются , если нажать повторно данные выводятся дальше..Казалось бы все работает но стоит в режиме паузы повисеть несколько минут клавиша становится неработоспособной. Скрипт просто перестает реагировать на нажатие паузы и замерзает. Проверяю логи на количество проходов замерзает всегда на разных элементах массива. Каким образом можно это исправить?
Ответить с цитированием