在我提出这个问题之前,我已经搜索了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;
});
这不应该起作用,因为我在阵列中不够深。
已解决必须使用超时功能,因为数组在完全填充之前排序,这让我觉得它根本没有排序。如果有更好的方法来检查阵列是否已完成填充,请告诉我:)
setTimeout(function(){
arr = arr.sort(function (a, b) {
return a.name.localeCompare( b.name );
});
console.log(arr);
}, 5000);
答案 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;
});
}