2017-12-09 24 views
-1

각 이벤트의 끝 날짜와 시작 날짜 만있는 개체의 이벤트 데이터 배열이 있습니다. Javascript : 날짜별로 데이터를 그룹화하고 사이에 요일을 입력하십시오.

let listOfEvents = [{ 
    "end": Date 2017-12-09T11:12:00.000Z, 
    "start": Date 2017-12-14T03:12:00.000Z, 
    "title": "Event One" 
},{ 
    "end": Date 2017-11-10T11:12:00.000Z, 
    "start": Date 2017-11-12T03:12:00.000Z, 
    "title": "Event Two" 
}] 

내가 하루에 작성하고 추가 로직을 추가하는 방법, 나는 최종 출력이 내가 현재 가지고있는 것입니다

let listOfEvents = [{ 
     "date": Date 2017-12-09T11:12:00.000Z, 
     "title": "Event One" 
    },{ 
     "date": Date 2017-12-10T11:12:00.000Z, 
     "title": "Event One" 
    }{ 
     "date": Date 2017-12-11T11:12:00.000Z, 
     "title": "Event One" 
    }{ 
     "date": Date 2017-12-12T11:12:00.000Z, 
     "title": "Event One" 
    }{ 
     "date": Date 2017-12-13T03:12:00.000Z, 
     "title": "Event One" 
    }{ 
     "date": Date 2017-12-14T11:12:00.000Z, 
     "title": "Event One" 
    },{ 
     "date": Date 2017-11-10T11:12:00.000Z, 
     "title": "Event Two" 
    },{ 
     "date": Date 2017-11-11T03:12:00.000Z, 
     "title": "Event Two" 
    },{ 
     "date": Date 2017-11-12T03:12:00.000Z, 
     "title": "Event Two" 
    }] 

로 원하는

let newEvents = [];  
listOfEvents.forEach(function (item) { 
     newEvents.push({ 
      date: item.start, 
      title: item.title 
     }) 
    }); 

입니다 마지막 날까지 각각의 새로운 항목에 대한 하루가 다음 루프에서 계속됩니까? 필요한 경우 순간을 포함시킬 수 있습니다.

+1

예상 출력이 혼란 사양까지이는 생각으로 준비가되면, 내가 특별히이 무시했습니다. 시간에 대해서도 관심이 있습니까? 또는 항목에 시간 구성 요소를 임의로 설정 했습니까? ie : 03:12 & 11:12 –

답변

2

array#reduce을 사용하고 날짜를 비교하고 종료일이 시작일보다 작을 때까지 새로운 날을 결과 배열에 계속 추가 할 수 있습니다.

let listOfEvents = [{ "end": "2017-12-09T11:12:00.000Z", "start": "2017-12-14T03:12:00.000Z", "title": "Event One" },{ "end": "2017-11-10T11:12:00.000Z", "start": "2017-11-12T03:12:00.000Z", "title": "Event Two" }]; 
 

 
var result = listOfEvents.reduce((r, { 
 
    end, 
 
    start, 
 
    title 
 
}) => { 
 
    end = new Date(end); 
 
    start = new Date(start); 
 

 
    while (end < start) { 
 
    r.push({ 
 
     'date': new Date(end), 
 
     title 
 
    }); 
 
    end.setDate(end.getDate() + 1); 
 
    } 
 
    if (Math.abs(start.getTime() - end.getTime()) < 1000 * 3600 * 24) { 
 
    r.push({ 
 
     'date': new Date(start), 
 
     title 
 
    }); 
 
    } 
 

 
    return r; 
 
}, []); 
 
console.log(result);

주어진 입력에 기초하여 범위를 생성하는 함수를 추출하고, 다음 데이터가 주어진다으로하는 새로운 배열 start

주 이벤트를 줄일 수

+0

코드를 제공해 주셔서 감사합니다. 나는 단지 reduce 함수 안에 if 문이 필요한 이유를 이해하려고 노력하고있는 중이다. – Kevin

+0

if 조건은 종료 데이터와 시작 날짜의 차이가 하루 미만이면 '시작'날짜를 추가합니다. –

+0

오, 알았어.하지만 getTime()이 함수가 아니라는 오류가 발생했습니다. 나는 다른 것을 놓치고 있니? – Kevin

1

end 속성이 거꾸로 된 것처럼 보입니다. 주어진 질문은 순수하게 날짜 또는 날짜 시간에 비교해야하는지에 대해 말하지 않습니다. @Hassans answer이 데이터 세트에 항목을 추가 어디

const extractDateRange = (range, transform) => { 
 
    let results = []; 
 
    // note that start and end date seem to be up side down in the question 
 
    let curDate = new Date(range.end); 
 
    let endDate = new Date(range.start); 
 
    while (curDate <= endDate) { 
 
    results.push(transform(new Date(curDate), range)); 
 
    curDate.setDate(curDate.getDate() + 1); ///add 1 day 
 
    } 
 
    return results; 
 
}; 
 

 
let listOfEvents = [{ 
 
    "end": '2017-12-09T11:12:00.000Z', 
 
    "start": '2017-12-14T03:12:00.000Z', 
 
    "title": "Event One" 
 
},{ 
 
    "end": '2017-11-10T11:12:00.000Z', 
 
    "start": '2017-11-12T03:12:00.000Z', 
 
    "title": "Event Two" 
 
}]; 
 

 
let allEvents = listOfEvents.reduce((current, item) => current.concat( 
 
    extractDateRange(item, (date, props) => ({ 
 
    title: props.title, 
 
    date 
 
    }))) 
 
, []); 
 

 
console.log(allEvents);

+0

답장을 보내 주셔서 감사합니다. 로그를 콘솔 할 때 왜 [0 ... 99] [100 ... 121]과 같은 데이터를 얻는 지 궁금합니다. 마치 하나의 큰 배열에 반대하는 두 그룹으로 데이터를 분할하는 것처럼. – Kevin

+0

@Kevin 그래, 더 이상 사람이 읽을 수있게하기 위해 콘솔의 표준 출력이라고 걱정하지 마십시오. – Icepickle

+0

이 맞습니다! 다시 한번 감사드립니다! – Kevin