2014-04-16 3 views
0

나는 사람의 작업 일정을 배열에로드하는 일정 관리 시스템에서 작업하고 있으며 사용자는 해당 일 내에 새로운 근무를 "주입"할 수 있습니다. 물론 코드에서 따라야하는 몇 가지 규칙이 있으며, 다음과 같습니다.JavaScript에서 범위를 어떻게 연결합니까?

  1. 기존 교대와 추가 된 항목 사이에는 간격이 없어야합니다. 즉, 추가 된 항목의 종료 시간은 첫 번째 항목의 시작 시간과 같거나 커야하며 추가 된 항목의 시작 시간은 마지막 항목의 종료 시간과 같거나 작아야합니다.

  2. 추가 된 시프트는 해당 기간 동안 발생하는 기존 시프트를 덮어 써야합니다. 본질적으로 배열에 자체를 접합해야하지만 .splice() 메서드를 사용하는 방법을 잘 모르겠습니다.

  3. 영향을받는 시간 블록은 새 항목을 수용하기 위해 잘려서/압축되어야합니다. 예를 들어 한 시간 동안 존재하는 시간 블록이 있고 20 분 안에 그 시작 부분에 10 분 블록을 삽입하면 원래 블록의 처음 20 분 부분에 10 분 추가 된 항목 다음에 원래 블록의 나머지 부분이옵니다. 추가 된 항목은 다른 시간 블록과 겹칠 수 있어야합니다. 따라서 우리가 4 개의 다른 시간 블록 (또는 그 안에서 시작/정지!)을 덮는 3 시간 블록을 추가하면 각각의 시간 블록을 덮어 써야합니다.

기본적으로 범위를 연결하기 때문에이 작업은 충분히 간단하지만 JavaScript에서 범위를 연결하는 방법을 알지 못합니다. 나는 범위는 자바 스크립트에서 스플 라이스 어떻게

var obj = { 
    start: '', 
    end: '', 
}; 
var objArray = []; 
var tmpArray = []; 
var finalArray = []; 
objArray.push({start: "12:00", end: "12:45"}); 
objArray.push({start: "12:45", end: "1:00"}); 
objArray.push({start: "1:00", end: "1:30"}); 
objArray.push({start: "1:30", end: "2:30"}); 
// added object 
obj.start = "12:00"; 
obj.end = "12:10"; 
for (var i = 0; i < objArray.length; i++) { tmpArray.push(objArray[i]); } 
//tmpArray = objArray; // preserve the original array 
objArray.push(obj); 
console.clear(); 
console.log("%o", objArray); 
objArray.sort(function(a, b) { var x = a.start; var y = b.start; return ((x < y) ? -1 : ((x > y) ? 1 : 0)); }); 
// sanity check 
if (obj.start >= obj.end){ 
    console.log('Time logic is invalid.'); 
    return false; 
} 
if (obj.end < tmpArray[0].start) { 
    console.log('There is a gap before the first item.'); 
    return false; 
} 
if (obj.start > tmpArray[tmpArray.length - 1].end){ 
    console.log('There is a gap after the last item.'); 
    return false; 
} 

// Now for the fun stuff... 
for (var i = 0; i < objArray.length; i++){ 
    var tmpobj = objArray[i]; 
    if (tmpobj.start == obj.start && tmpobj.end == obj.end){ // find our inserted object 
     index = i; 
     console.log('<<< obj injected: %s - %s [%d] >>>', obj.start, obj.end, index); 
     if (index == 0){ // is first item, start time was less than first item's start time 
      finalArray.push(obj); 
      if (obj.end == tmpArray[0].start){ 
       finalArray.push(tmpArray[0]); // item insertion was a complete prepend... 
      } else if (obj.end >= tmpArray[tmpArray.length - 1].end){ 
       console.log('entire array is consumed'); // item covers entire shift... 
      } else { 
       // This code is reached when obj start time is before or equal to first item 
       console.log('obj <= tmpArray[0].start, end > tmpArray[0].start'); 
      } 
     } else { 
      if (obj.start == tmpArray[tmpArray.length - 1].end){ 
       console.log('Item added at end of shift'); 
       finalArray.push(tmpArray[i - 1]); 
       finalArray.push(obj); 
      } 
     } 
    } else { 
     console.log('obj tested: %s - %s [%d]', tmpobj.start, tmpobj.end, i); 
     if (obj.start > tmpobj.end) { 
      finalArray.push(tmpobj); 
     } 
     if (obj.end < tmpobj.start) { 
      finalArray.push(tmpobj); 
     } 
    } 
// now iterate through array and combine like terms (activity type) 
} 
for (var i = 0; i < finalArray.length; i++){ 
    console.log('%d) s: %s, e: %s', i, finalArray[i].start, finalArray[i].end); 
} 

: 여기

는 지금까지 이러한 규칙을 구현하기 위해 작성한 코드입니까?

답변

0

시간 블록을 으로 시작하여끝을으로 따로 고려해 볼 수 있습니다. 나는 개념적으로 그것을 배열로 구현할 수있는 연결된 목록으로 생각합니다. 목록의 각 노드는 START_TIME -> END_TIME의 순서를 따라야하며 2 START_TIME 또는 2 END_TIME 노드가 서로 인접하지 않는 특별한 요구 사항이 있습니다. 그 사이의 임의의 시간 (여유 시간 블록)은 START_TIMEEND_TIME 노드로 정의됩니다.

SSTART_TIME

E 그래서 다음 시간의 새로운 블록을 삽입 할 논리를 코딩 할 때, 당신이 원하는을 찾아이 [S1, E1, S2, E2, S3 ,E3]

처럼 보일 수 유효 시간 블록의 배열 END_TIME

입니다 새로운 시간 블록에 대해 START_TIME 노드로 이동 한 다음 END_TIME E* 노드와 새 블록의 시작을 나타내는 START_TIME S-NEW 노드를 만들어 "연결"하십시오.

[S1, E1 ,S2 ,E* ,S-NEW, E2, S3, E3]

그런 다음 당신이 필요합니다 (이전 END_TIME E2를 제거하고 "무료"블록을 생성하는) 경우, END_TIME 노드를 작성하여

[S1, E1, S2, E*, S-NEW, E-NEW, S-FREE, E-FREE, S3, E3]

를 종료 시간을 정의하거나 이전 END_TIME E2 노드를 다시 사용할 수 있습니다 같은 시간에 끝나면 먼저 연결됩니다.

[S1, E1, S2, E*, S-NEW, E2, S3, E3]

마지막에 두뇌를 아프게하는 이유는 코드가 너무 많은 것을 한 번에 처리하기 때문입니다. 함수로 분해 할 것을 제안합니다. 다음은 몇 가지 제안입니다.

canStart(time) 
canEnd(time) 
insertBlock(startBlock, endBlock) 
removeBlock(startBlock, endBlock) 
관련 문제