2016-03-28 27 views
-1

我正在为客户端构建一个自定义日历类事物,它不会接受开箱即用的行为,并且我在导航如何将我需要的数组拼接在一起时遇到了一些问题正确显示日期。使用日期复杂的数组操作

一些背景:这是一个基于SharePoint的解决方案,用户在一个列表中输入旅行日期和位置,在另一个列表中输入默认位置。输出需要四周的时间跨度,以显示用户在任何特定日期的位置,无论是这些旅行地点之一还是默认(家庭办公室)地点。

所以我做了一个REST调用旅行列表([whereabouts]),一个默认位置列表([默认值]),并在代码中做一些其他的东西来建立从今天到今天的日期数组+28([allDates])。

我试过一堆嵌套for循环,它并没有真正返回正确的东西。但我需要基本上说:在[allDates]中的每一天,那个日期的[下落]中是否有一个事件?如果是这样,然后推事件标题。如果不是,则从[默认值]推入默认位置。

我完全迷失在这里,乡亲们,任何帮助都超级赞赏。

编辑

在回答拉杰什,[下落]是活动的阵列具有以下属性的对象:

  • 日期(UTC字符串)
  • 事件长度(字符串)
  • 团队成员(字符串)
  • 标题(字符串)

[allDates]是从今天到今天+ 28天的日期字符串数组。

[默认值]为对象的数组具有以下属性:

  • 团队成员(串)
  • 位置(串)

和我有什么例子/正在尝试:

(完成REST调用并返回其数据后)

function initCal(){ 

    //Groups returned whereabouts data into arrays per team member name. 
    var grouped = _(whereabouts).groupBy(function(o){ 
     return o.Team_x0020_Member.Title; 
    }); 

    //Reduces the above to something a little more simple for me to work with. 
    grouped = _.pairs(grouped)   

    //Full disclosure, this is going into a google charts data table. 
    var tbl = new google.visualization.DataTable(); 

    //Building the allDates array and adding in day names. 
    for(var i=0;i<14;i++){ 
     var weekday = new Array(7); 
     weekday[0]= "Sunday"; 
     weekday[1] = "Monday"; 
     weekday[2] = "Tuesday"; 
     weekday[3] = "Wednesday"; 
     weekday[4] = "Thursday"; 
     weekday[5] = "Friday"; 
     weekday[6] = "Saturday";     
     var day = today.addDays(i); 
     var d = weekday[day.getDay()]; 
     var n = day.toLocaleDateString(); 
     tbl.addColumn('string',n); 
    } 

    //I have to do some manipulation of the object google creates. It looks kind of weird, but the output is that allDates array. 
    var allDates = []; 
    var colsArr = tbl.Kf;    
    for(var i=0;i<colsArr.length;i++){ 
     if(colsArr[i].label != ''){ 
      allDates.push(colsArr[i].label); 
     } 
    } 

    //This is ultimately where the results will go. 
    var rows = []; 

    //Cycle through grouped, get the current team member, then go manipulate all these arrays using getEvents. 
    for(var i=0;i<grouped.length;i++){ 
     var thisTM = grouped[i][0]; 
     var whereabouts = grouped[i][1]; 
     rows.push([thisTM,getEvents(whereabouts,defaults,allDates)]); 
    } 

    //This is just where the data table goes.  
    var table = new google.visualization.Table(document.getElementById('whereabouts')); 
      table.draw(tbl, {width: '100%', height: '100%'});   

} 

//Just needed something to get the day names. Not important, left here because laziness. 
Date.prototype.addDays = function(days){ 
    var dat = new Date(this.valueOf()); 
    dat.setDate(dat.getDate() + days); 
    return dat; 
} 


function getEvents(whereabouts,defaults,allDates){ 
    //Figure I'll put the finished results here and return this array. 
    var events = []; 

    //Empty array for formatted dates. 
    var evDate = []; 

    //Format the whereabouts date strings into locale date strings so I can do comparisons against the allDates date strings. 
    for(var i=0;i<whereabouts.length;i++){ 
     var formatD = new Date(whereabouts[i].Date).toLocaleDateString(); 
      evDate.push(formatD); 
    } 

    for(var i=0;i<allDates.length;i++){ 
     for(var j=0;j<evDate.length;j++){ 
      if (evDate[j] === allDates[i]){ 
       events.push(whereabouts[j].Title); 
      } else { 
       events.push(defaults.Title); 
      } 
     } 
    }  
} 

编辑2 另一个环境。应该返回到initCal的东西应该是一个长度与allDays完全相同但包含事件标题(如果有的话)或默认位置(如果当天没有事件)的数组。

这有道理吗?再次感谢您的帮助和反馈。

+1

你可以分享这些变量的样子吗? – Rajesh

+1

不是我的专业语言,但如果你想在这里得到任何人的帮助,最好提供你已经试过的任何代码。 –

+0

当然,所有好的反馈。我已经添加了数组的说明以及我正在使用的自我记录代码。 – ChrisPEditor

回答

-1

不是一个真正的答案,但评论不够大。

据推测,“UTC字符串”是指ISO 8601扩展格式日期,如“2016-03-29T10:43:23Z”或类似字样。大多数浏览器都会正确解析,但我建议您自己解析它以确保(在这里有很多问题)。

为了便于比较,如果你只想匹配日期(没有时间),那么你可以比较相同格式的字符串,或者你可能只是得到时间值并比较。使用时间值的优点是,您还可以使用大于和小于。尽管中午(12:00:00)或午夜(00:00:00),请务必先将时间设置为某个常用值。

无论哪种方式,写一个函数来按照你想要的方式格式化日期。

如果你不想要像moment.js这样的库(哪种接管所有东西),例如, Date.formatdate-format,第二个也有一个很好的小解析器。这些将使用简单的Date对象,而Moment.js在Date中创建它自己的包装。