使用 Jquery map 和 moment js 制作一个简单的时间轴
Making a simple timeline with Jquery map and moment js
除了一个我无法弄清楚的小问题外,我得到了一个时间表。它按日期对我的项目进行分组,但在没有条目时跳过日期。我希望显示这些日期,但会留言说 "No entries to display"。
例如:
如果我 select 日期范围从 2016-05-02
到 2016-05-04
我想得到:
Monday 2 May 2016
1 Test1
2 Test2
Tuesday 3 May 2016
No items to display...
Wednesday 4 May 2016
3 Test3
4 Test4
这是我的代码的粗略示例:
https://jsfiddle.net/vLdn68ko/15/
var items_by_date = {}; // declare an object that will have date indexes
$.ajax({url:"/SomeUrlBeginninWithSlash/daterange/?$filter=(start_date ge '2016-05-02') and (end_date lt '2016-05-04')",
dataType: 'json',
cache: false,
success: function (data) {
data.d.results.map(function(item){
var item_date = moment(item.Date).format('dddd D MMMM YYYY');
// if the date index does not exist we need to declare it
if(!items_by_date[item_date]) items_by_date[item_date] = [item];
// else we can just push the item on that array
else items_by_date[item_date].push(item);
})
console.log(items_by_date);
// now you can render how ever you need to
drawTable(items_by_date);
}
});
function drawTable(data){
$('#dataTable').html('');
for(var d in data){ // d will be the date index
$('#dataTable').append('<tr><td colspan="2" style="font-weight: bold;">'+d+'</td></tr>');
data[d].map(function(item){
$('#dataTable').append('<tr><td>'+item.ID+'</td><td>'+item.Description+'</td></tr>');
})
}
}
我将非常感谢对此的任何帮助。
所以您基本上需要从您的范围中获取最小日期,获取最大值,然后用没有条目的日期填充您的数据。它有点难看,因为你保留了日期字符串而不是日期,所以必须转换但它工作正常:
var items_by_date = {}; // declare an object that will have date indexes
$.ajax({url:"/SomeUrlBeginninWithSlash",
dataType: 'json',
cache: false,
success: function (data) {
data.d.results.map(function(item){
var item_date = moment(item.Date).format('dddd D MMMM YYYY');
// if the date index does not exist we need to declare it
if(!items_by_date[item_date]) items_by_date[item_date] = [item];
// else we can just push the item on that array
else items_by_date[item_date].push(item);
})
fillEmpty(items_by_date);
// now you can render how ever you need to
drawTable(items_by_date);
}
});
function fillEmpty(items_by_date){
var dates = Object.keys(items_by_date).map(function(d){return new Date(d)})
var minDate = new Date(Math.min.apply(null,dates))
var maxDate = new Date(Math.max.apply(null,dates))
while(minDate < maxDate){
minDate.setDate(minDate.getDate()+1)
var key = moment(minDate).format('dddd D MMMM YYYY');
items_by_date[key] = items_by_date[key] || [{ID:"",Description: "No items to display..."}]
}
}
function drawTable(data){
$('#dataTable').html('');
Object.keys(data).sort(function(a,b){return new Date(a)-new Date(b)}).forEach(function(d){ // you actually need to show them sorted by day
$('#dataTable').append('<tr><td colspan="2" style="font-weight: bold;">'+d+'</td></tr>');
data[d].map(function(item){
$('#dataTable').append('<tr><td>'+item.ID+'</td><td>'+item.Description+'</td></tr>');
})
})
}
完整 Fiddle: https://jsfiddle.net/vLdn68ko/18/
除了一个我无法弄清楚的小问题外,我得到了一个时间表。它按日期对我的项目进行分组,但在没有条目时跳过日期。我希望显示这些日期,但会留言说 "No entries to display"。
例如:
如果我 select 日期范围从 2016-05-02
到 2016-05-04
我想得到:
Monday 2 May 2016
1 Test1
2 Test2
Tuesday 3 May 2016
No items to display...
Wednesday 4 May 2016
3 Test3
4 Test4
这是我的代码的粗略示例: https://jsfiddle.net/vLdn68ko/15/
var items_by_date = {}; // declare an object that will have date indexes
$.ajax({url:"/SomeUrlBeginninWithSlash/daterange/?$filter=(start_date ge '2016-05-02') and (end_date lt '2016-05-04')",
dataType: 'json',
cache: false,
success: function (data) {
data.d.results.map(function(item){
var item_date = moment(item.Date).format('dddd D MMMM YYYY');
// if the date index does not exist we need to declare it
if(!items_by_date[item_date]) items_by_date[item_date] = [item];
// else we can just push the item on that array
else items_by_date[item_date].push(item);
})
console.log(items_by_date);
// now you can render how ever you need to
drawTable(items_by_date);
}
});
function drawTable(data){
$('#dataTable').html('');
for(var d in data){ // d will be the date index
$('#dataTable').append('<tr><td colspan="2" style="font-weight: bold;">'+d+'</td></tr>');
data[d].map(function(item){
$('#dataTable').append('<tr><td>'+item.ID+'</td><td>'+item.Description+'</td></tr>');
})
}
}
我将非常感谢对此的任何帮助。
所以您基本上需要从您的范围中获取最小日期,获取最大值,然后用没有条目的日期填充您的数据。它有点难看,因为你保留了日期字符串而不是日期,所以必须转换但它工作正常:
var items_by_date = {}; // declare an object that will have date indexes
$.ajax({url:"/SomeUrlBeginninWithSlash",
dataType: 'json',
cache: false,
success: function (data) {
data.d.results.map(function(item){
var item_date = moment(item.Date).format('dddd D MMMM YYYY');
// if the date index does not exist we need to declare it
if(!items_by_date[item_date]) items_by_date[item_date] = [item];
// else we can just push the item on that array
else items_by_date[item_date].push(item);
})
fillEmpty(items_by_date);
// now you can render how ever you need to
drawTable(items_by_date);
}
});
function fillEmpty(items_by_date){
var dates = Object.keys(items_by_date).map(function(d){return new Date(d)})
var minDate = new Date(Math.min.apply(null,dates))
var maxDate = new Date(Math.max.apply(null,dates))
while(minDate < maxDate){
minDate.setDate(minDate.getDate()+1)
var key = moment(minDate).format('dddd D MMMM YYYY');
items_by_date[key] = items_by_date[key] || [{ID:"",Description: "No items to display..."}]
}
}
function drawTable(data){
$('#dataTable').html('');
Object.keys(data).sort(function(a,b){return new Date(a)-new Date(b)}).forEach(function(d){ // you actually need to show them sorted by day
$('#dataTable').append('<tr><td colspan="2" style="font-weight: bold;">'+d+'</td></tr>');
data[d].map(function(item){
$('#dataTable').append('<tr><td>'+item.ID+'</td><td>'+item.Description+'</td></tr>');
})
})
}
完整 Fiddle: https://jsfiddle.net/vLdn68ko/18/