2017-05-07 68 views
1

我无法控制数据列表,但我需要将其映射到日期范围数据。生成日期并向对象数组添加新属性

数据列表看起来像这样,只有从和到。

[ 
    { 
     "date_from": "2017-05-06 00:00:00", 
     "date_to": "2017-05-08 23:59:59", 
     "state": { 
      "name": "San francisco" 
     } 
    } 
    { 
     "date_from": "2017-05-03 00:00:00", 
     "date_to": "2017-05-07 23:59:59", 
     "state": { 
      "name": "Las Vegas" 
     } 
    } 
] 

我能产生上月

function generateDates(startDate, stopDate) { 
    var dateArray = []; 
    var currentDate = moment(startDate); 
    var stopDate = moment(stopDate); 
    while (currentDate <= stopDate) { 
    dateArray.push({ 
     date: moment(currentDate).format('YYYY-MM-DD') 
    }); 
    currentDate = moment(currentDate).add(1, 'days'); 
    } 

    return dateArray; 
} 

generateDates('2017-05-01', '2017-05-31'); 

我怎样才能把状态对象为日期范围阵列状

[ 
{date: '2017-05-06', state:{name:'San francisco'}}, 
{date: '2017-05-07', state:{name:'San francisco'}}, 
{date: '2017-05-08', state:{name:'San francisco'}}, 
.. 
.. 
] 
+0

您必须在将日期推到dateArray之前添加状态。恐怕必须通过迭代每个生成日期的列表来完成。您可以通过对列表进行排序进一步对其进行优化,并且验证应该在多个匹配中。 –

+0

看看http://stackoverflow.com/questions/43831941/split-from-date-and-to-date-to-a-list-of-date-range-array/43832057?noredirect=1#。 .. –

+0

你的日期没有时区,应该使用哪一个? – RobG

回答

-1
var sparse=input.reduce((sparse,event)=>generateDates(event.date_from,event.date_to).forEach(date=>(sparse[date]=sparse[date]||[]).push(event))||sparse,{}); 

var result=[]; 
for(date in sparse){ 
result.push({date:date,states:sparse[date].map(el=>el.state)}); 
} 

http://jsbin.com/larumiyeli/edit?console日期范围的基础

或者如果你不要组:

var result=input.reduce((sparse,event)=>sparse.concat(generateDates(event.date_from,event.date_to).map(el=>(el.state=event.state,el)),[]); 

http://jsbin.com/mixorecoyo/edit?console

对于解释看其他答案...看起来像一个孤单类在这里是不是? ;)

+0

如果此问题重复,请将其标记为重复。发布代码并没有太多意义,然后链接到有解释的答案。此外,将代码发布为可运行代码段比链接到外部网站要好得多。 – RobG

+0

@RobG问题不会以任何方式相等。我不想破坏他所取得的进展...并且关于片段:*片段不能在移动设备上使用* ... –