2017-05-07 33 views
0

我有對象的數組:生成時間範圍給定日期從和向

[{from:'2017-05-02',to:'2017-05-12',event:'google map launch day'}, 
{from:'2017-05-03',to:'2017-05-14',event:'marie"s farewell'}, 
{from:'2017-05-20',to:'2017-05-20',event:'iphone showcase'}] 

欲事件屬性到對象的陣列映射下面

[{ 
date: "2017-05-01" 
}, 
{ 
date: "2017-05-02", 
event: ['google map launch day'] 
}, 
{ 
date: "2017-05-03", 
event: ['google map launch day', 'marie"s farewell'] 
}, 
{ 
date: "2017-05-04", 
event: ['google map launch day', 'marie"s farewell'] 
} 
.. 
] 

https://pastebin.com/raw/Uv3U8zCy

我無法控制第一個數組對象,它來自外部API,我想構建一個自定義日曆,我努力將其映射到一個新的對象數組格式。

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'); 

我能夠使用momentjs生成一個月的日子,但我仍然卡住。

+1

爲什麼你問同樣的問題兩次? http://stackoverflow.com/a/43833684/5260024 –

回答

0

您可以使用散列表作爲生成日期的參考,並稍後以相同樣式重複事件。

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

 
    var dateArray = [], 
 
     hash = {}; 
 

 
    generateDates(startDate, stopDate); 
 

 
    data.forEach(function (a) { 
 
     var currentDate = moment(a.from), 
 
      stopDate = moment(a.to), 
 
      date; 
 

 
     while (currentDate <= stopDate) { 
 
      date = moment(currentDate).format('YYYY-MM-DD'); 
 
      hash[date].event = hash[date].event || []; 
 
      hash[date].event.push(a.event); 
 
      currentDate = moment(currentDate).add(1, 'days'); 
 
     } 
 
    }); 
 
    return dateArray; 
 
} 
 

 
var data = [{ from: '2017-05-02', to: '2017-05-12', event: 'google map launch day' }, { from: '2017-05-03', to: '2017-05-14', event: 'marie"s farewell' }, { from: '2017-05-20', to: '2017-05-20', event: 'iphone showcase' }]; 
 

 

 
console.log(getRanges(data, '2017-05-01', '2017-05-31'));
.as-console-wrapper { max-height: 100% !important; top: 0; }
<script src="https://cdnjs.cloudflare.com/ajax/libs/moment.js/2.15.2/moment.min.js"></script>

+0

omg這是beyong我的水平,今天學到了一些東西! –

0

可以使用moment.js的.isBetween並得到如下迭代日活動。

var eventData = [{from:'2017-05-02',to:'2017-05-12',event:'google map launch day'}, 
{from:'2017-05-03',to:'2017-05-14',event:'marie"s farewell'}, 
{from:'2017-05-20',to:'2017-05-20',event:'iphone showcase'}] 

// Get events for passed date 
function getEvents(curDate){ 
    return eventData.reduce(function(res,obj){ 
    if(moment(curDate).isBetween(obj.from, obj.to, null, '[]')) 
     res.push(obj.event); 
     return res; 
    },[]) 

} 

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

    return dateArray; 
}