2017-06-13 24 views
1

如何改變這種結構使用減少組日期作出date_from和DATE_TO

[ 
    {date_from:'15-6-2017'}, 
    {date_from:'16-6-2017'}, 
    {date_from:'17-6-2017'}, 
    {date_from:'29-6-2017'} 
    {date_from:'30-6-2017'} 
] 

這個的?

[ 
    {id:1,date_from:'15-6-2017',date_to:'17-6-2017'}, 
    {id:2,date_from:'29-6-2017',date_to:'30-6-2017'} 
] 

幸運的是,訂單已經是正確的,我腦子裏流行的是減少,我仍然卡住。我正在使用的時刻。

+1

什麼是設置DATE_TO日期的邏輯是什麼? – Firemen26

+0

數據'id'(自動增量可能)和'date_to'從哪裏來? –

+0

@ daan.desmedt索引?沒關係。 –

回答

1

這似乎是這樣的:

var setToDate = function(dateStr, days) { 
    var d = dateStr.split('-') 
    var date = new Date(d[2], d[1], d[0]) 
    date.setDate(date.getDate() + days); 
    return date.getDate() + '-' + date.getMonth() + '-' + date.getFullYear(); 
} 

var arr = [ 
    {date_from:'15-6-2017'}, 
    {date_from:'16-6-2017'}, 
    {date_from:'17-6-2017'}, 
    {date_from:'29-6-2017'}, 
    {date_from:'30-6-2017'} 
] 

for(var i=0; i<arr.length; i++) { 
    arr[i].id = i+1; 
    arr[i].date_to = setToDate(arr[i].date_from, 1); 
} 

console.dir(arr) 
+0

是什麼?你甚至可以理解這個問題嗎? –

+1

@AlanJenshen現在檢查 – Firemen26

1

這是解決你的代碼,你可以添加格式,只要你想你的日期。

let string = [{ 
 
    date_from: '15-6-2017' 
 
    }, 
 
    { 
 
    date_from: '16-6-2017' 
 
    }, 
 
    { 
 
    date_from: '17-6-2017' 
 
    }, 
 
    { 
 
    date_from: '29-6-2017' 
 
    }, 
 
    { 
 
    date_from: '30-6-2017' 
 
    } 
 
]; 
 

 
//split them and pull out any white spaces from beginning and end 
 
let dates = string.map(s => { 
 
    s = s.date_from.trim(); 
 
    let nums = s.split('-'); 
 
    let d = new Date(nums[2], nums[1], nums[0]); 
 
    return { 
 
    date: d, 
 
    string: s 
 
    }; 
 
}); 
 
let currentStart = dates[0]; 
 
let result = []; 
 
for (let i = 1; i < dates.length; i++) { 
 
    let { 
 
    date, 
 
    string 
 
    } = dates[i]; 
 
    //If last date, add range 
 
    if (i == dates.length - 1) { 
 
    console.log("hello"); 
 
    result.push({ 
 
     start: currentStart.string, 
 
     end: string 
 
    }); 
 
    } else { 
 
    let prevDate = dates[i - 1] || currentStart; //in case prevDate is undefined 
 
    let nextDate = dates[i + 1]; 
 
    let diff = nextDate.date.getTime() - date.getTime(); 
 
    if (diff > (24 * 60 * 60 * 1000)) { 
 
     result.push({ 
 
     start: currentStart.string, 
 
     end: string 
 
     }); 
 
     currentStart = nextDate; 
 
    } 
 
    } 
 
} 
 

 
console.log(result, 'result');

這是代碼的codepen這樣你就可以隨時進行編輯。 demo

+0

偉大的工作,但我不能使用這個,我需要用時刻來避免長碼。 –

1

你是正確的,它可以很容易地用做減少:

var dates = [ 
 
    {date_from:'15-6-2017'}, 
 
    {date_from:'16-6-2017'}, 
 
    {date_from:'17-6-2017'}, 
 
    {date_from:'29-6-2017'}, 
 
    {date_from:'30-6-2017'} 
 
]; 
 

 
var toT = (d)=>Date.parse(d.split('-').reverse().join('/')) 
 

 
var out = dates.reduce((newArr,d,i)=>{ 
 
    if (i==1) newArr = [{id:1,date_from:newArr.date_from,date_to:newArr.date_from}]; 
 
    var prevD = newArr[newArr.length-1].date_to; 
 
    if (toT(prevD) + (24*60*60*1000) == toT(d.date_from)) newArr[newArr.length-1].date_to = d.date_from; 
 
    else newArr.push({id:newArr.length+1,date_from:d.date_from,date_to:d.date_from}) 
 
    return newArr; 
 
}) 
 

 
console.log(out)

+1

什麼是 'var toT =(d)=> Date.parse(d.split(' - ')。reverse()。join('/'))'do? –

+0

從日期格式中獲取時間戳,將其變爲單獨的函數以縮短代碼。 –

+0

我得到了這行未定義的錯誤var prevD = newArr [newArr.length-1] .date_to; –

1

你可以只在最後一天檢查差異,如果差異插入一個新的對象不等於一個。

基本上它試圖得到結果數組的最後日期,如果它沒有設置,它使用一個空對象。然後它取值date_to屬性並將該值轉換爲moment對象,以便稍後與date_from進行比較。

經過一天所需的差異檢查後,date_from屬性得到更新。如果差異不屬於一個,則將新對象添加到結果集中。

var data = [{ date_from: '15-6-2017' }, { date_from: '16-6-2017' }, { date_from: '17-6-2017' }, { date_from: '29-6-2017' }, { date_from: '30-6-2017' }], 
 
    id = 1, 
 
    grouped = data.reduce(function (r, o) { 
 
     var last = moment((r[r.length - 1] || {}).date_to, 'D-M-Y'); 
 

 
     if (moment(o.date_from, 'D-M-Y').diff(last, 'd') === 1) { 
 
      r[r.length - 1].date_to = o.date_from; 
 
     } else { 
 
      r.push({ id: id++, date_from: o.date_from, date_to: o.date_from }); 
 
     } 
 
     return r; 
 
    }, []); 
 

 
console.log(grouped);
.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

優雅的解決方案將代碼轉換爲非ES6,沒有想過使用r.length - 1.很好,如果你可以解釋一步步驟如何工作。 –