jQuery按日期排序嵌套的JSON对象?

时间:2015-11-18 02:50:02

标签: jquery json sorting date object

在我提出这个问题之前,我已经搜索了StackOverflow,但我无法找到解决方案。 我收到了来自多个Facebook Graph API来电的对象(请参阅第一张图片)。 我想做的是按日期(event.start_time)对对象进行排序。 是否可以创建额外的数组?

第二张图片中可以看到对象的结构。

变量" event"掌握所有物品。

更新 我创建了一个全局数组并将所有事件对象推送到它,它现在是一个数组,所以它应该是可排序的。我只是不知道如何,请帮忙。

        var arr = []; //global array to sort event objects
    //function is called somewhere
    function makeEvents(ids, infowindow, map, accessToken) {
            var currentTime = dateFormat("date", new Date(), true);
            //console.log(currentTime);
            var display = document.getElementById("all");
            var carousel = document.getElementById("carousel-inner");
             // console.log(ids);

            FB.api('/',
            {ids : ids}, 
            function (pages) {
              if(pages) {
                $.each(pages, function(page_key, page_value) {
                    var id = page_value.id;
                    //display.innerHTML += '<tr>';
                    //console.log(id);
                     //if date search changed, since date search input
                    FB.api('/'+ id +'/events?access_token='+ accessToken +'&since='+ currentTime, function (events) { //&offset=0   &until=2016-02-31
                        //console.log(events.data);

                      if(events) {
                        //console.log(events.data)
                        $.each(events.data, function(events_key, events_value) {
                          FB.api('/'+ events_value.id + '?fields=id,name,cover,description,start_time,place,ticket_uri,picture', function (event) {
                            if(event) {                                 
                             //console.log(event);
                             arr.push(event);//fill array
                              }
                          });
                        });
                      }
                    });
                   // display.innerHTML += '</tr>';
                });
              }
            });  
    }
    console.log(arr);
    arr.sort(function(a, b){
     if(a.start_time < b.start_time)
       return -1;
     if(a.start_time > b.start_time)
       return 1;
     return 0;
    });

这不应该起作用,因为我在阵列中不够深。

enter image description here

已解决必须使用超时功能,因为数组在完全填充之前排序,这让我觉得它根本没有排序。如果有更好的方法来检查阵列是否已完成填充,请告诉我:)

   setTimeout(function(){
      arr = arr.sort(function (a, b) {
        return a.name.localeCompare( b.name );
      });
      console.log(arr);
    }, 5000);

2 个答案:

答案 0 :(得分:2)

你不能像这样使用JavaScript排序功能吗? -

arr.sort(function(a, b){
    if(a.start_time < b.start_time)
        return -1;
    if(a.start_time > b.start_time)
        return 1;
    return 0;
});

http://www.w3schools.com/jsref/jsref_sort.asp

jsfiddle:https://jsfiddle.net/mhccnpkp/

更新:起初我认为这只是一个简单的排序问题,但现在我发现您正试图从ajax个调用列表中对结果进行排序。在这种情况下,你必须等待所有的调用完成加载,主要的事实是,不保证每个调用将按顺序结束。因此,我建议您使用信号量来确保所有调用都已结束,然后调用sort来对数组进行排序。像这样的东西 -

var arr = []; //global array to sort event objects
//function is called somewhere
var semaphore = 0; //the semaphore
function makeEvents(ids, infowindow, map, accessToken) {
    ....

    FB.api('/',
    {ids : ids}, 
    function (pages) {
      if(pages) {
        $.each(pages, function(page_key, page_value) {

            semaphore += 1; // increase the semaphore for each call
            ....
            FB.api('/'+ id +'/events?access_token='+ accessToken +'&since='+ currentTime, function (events) { //&offset=0   &until=2016-02-31
                //console.log(events.data);

              semaphore -= 1; //reduce semaphore count, sicne this call is completed 
              .....

                  semaphore += 1; // increase the semaphore for next call

                  FB.api('/'+ events_value.id + '?fields=id,name,cover,description,start_time,place,ticket_uri,picture', function (event) {

                    ....

                    semaphore -= 1; //reduce semaphore count, sicne this call is completed 

                    //check if all calls completed
                    if(semaphore == 0){
                        arr.sort(function(a, b){
                            if(a.start_time < b.start_time)
                                return -1;
                            if(a.start_time > b.start_time)
                                return 1;
                            return 0;
                        });
                    }                   
                  });

                });
              }

            });
           ...
        });
      }
    });  
}
console.log(arr);

BTW ,这是非常基本的检查。这仅在所有呼叫成功时才有效。所以你可能还想添加一些检查和错误处理程序,并减少错误处理程序中的信号量。另一个不成功的呼叫将使系统无限期地等待。

答案 1 :(得分:-1)

var arr = []; //global array to sort event objects
function makeEvents(ids, infowindow, map, accessToken) {
        var currentTime = dateFormat("date", new Date(), true);
        //console.log(currentTime);
        var display = document.getElementById("all");
        var carousel = document.getElementById("carousel-inner");
        // console.log(ids);

        FB.api('/',
        {ids : ids}, 
        function (pages) {
            if(pages) {
                $.each(pages, function(page_key, page_value) {
                    var id = page_value.id;
                    //display.innerHTML += '<tr>';
                    //console.log(id);
                    //if date search changed, since date search input
                    FB.api('/'+ id +'/events?access_token='+ accessToken +'&since='+ currentTime, function (events) { //&offset=0   &until=2016-02-31
                        //console.log(events.data);

                        if(events) {
                            //console.log(events.data)
                            $.each(events.data, function(events_key, events_value) {
                                FB.api('/'+ events_value.id + '?fields=id,name,cover,description,start_time,place,ticket_uri,picture', function (event) {
                                    if(event) {                                 
                                        arr.push(event);
                                        shortArray();
                                    }
                                });
                            });
                        }
                    });
                    // display.innerHTML += '</tr>';
                });
            }
        });  
    }


    function shortArray(){
        arr.sort(function(a, b){
            if(a.start_time < b.start_time)
                return -1;
            if(a.start_time > b.start_time)
                return 1;
            return 0;
        });
    }