Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #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. Возникает очень интересная ситуация: пауза срабатывает если нажать на кнопку данные останавливаются , если нажать повторно данные выводятся дальше..Казалось бы все работает но стоит в режиме паузы повисеть несколько минут клавиша становится неработоспособной. Скрипт просто перестает реагировать на нажатие паузы и замерзает. Проверяю логи на количество проходов замерзает всегда на разных элементах массива. Каким образом можно это исправить?
Ответить с цитированием
  #2 (permalink)  
Старый 13.03.2013, 14:32
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

Такой код перестал жрать ресурсы браузера то?
Ответить с цитированием
  #3 (permalink)  
Старый 14.03.2013, 05:51
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

Спасибо конечно что спросил, код жрать память перестал благодаря разбивки на несколько функций и немного измененной логике.. Вот сейчас только с паузой и сортировкой кто бы подсказал. Знатоки вы где?
Ответить с цитированием
  #4 (permalink)  
Старый 14.03.2013, 10:11
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

а на стороне сервера это сделать нельзя?
Ответить с цитированием
  #5 (permalink)  
Старый 14.03.2013, 10:11
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

я про сортировку по ключу v
Ответить с цитированием
  #6 (permalink)  
Старый 14.03.2013, 11:25
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

Попробуй так...
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});
     });          
});

Последний раз редактировалось skynet-mfd, 14.03.2013 в 13:50.
Ответить с цитированием
  #7 (permalink)  
Старый 15.03.2013, 07:47
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

Сообщение от skynet-mfd Посмотреть сообщение
Попробуй так...
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 . На каком участке их сортировать твоей функцией, можешь показать в коде?
Ответить с цитированием
  #8 (permalink)  
Старый 15.03.2013, 15:13
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

ну например в строке 26
Ответить с цитированием
  #9 (permalink)  
Старый 15.03.2013, 15:14
Аспирант
Отправить личное сообщение для skynet-mfd Посмотреть профиль Найти все сообщения от skynet-mfd
 
Регистрация: 29.12.2012
Сообщений: 40

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;
          })
        }
Ответить с цитированием
  #10 (permalink)  
Старый 15.03.2013, 18:49
Интересующийся
Отправить личное сообщение для Fareastaz Посмотреть профиль Найти все сообщения от Fareastaz
 
Регистрация: 13.10.2011
Сообщений: 10

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



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить Json в цикле? oleg_46 jQuery 5 21.05.2012 20:49
Двойная Фильтрация данных таблицы David0707 Общие вопросы Javascript 0 19.03.2012 13:00
Сортировка и фильтрация json jQuery amt779 jQuery 4 28.07.2011 12:53
Преобразование данных с сервера в JSON frolvict Общие вопросы Javascript 1 04.04.2010 12:26
Сортировка числовых данных в таблице Vladsss Общие вопросы Javascript 15 01.09.2009 17:02