2017-12-24 42 views
1

안녕하세요, 저는 전화를 걸고있는 API와 함께 부분 ISO 타임 스탬프를 작성하도록 설계된 함수를 가지고 있습니다. 타임 스탬프가 반환해야합니다 :이 자바 스크립트 타임 스탬프 빌더 함수의 복잡성/중첩 된 ifs를 줄이는 방법

2017Z 
2017-12Z 
2017-12-24Z 
2017-12-24T14Z 
2017-12-24T14:07Z 

나는 다음과 같이이 수행하는 데 사용하는 코드 :

function parsePartialDateTime(datetime = {}) { 
    if (datetime === null || datetime.year === undefined) { 
    return null; 
    } 

    let dateString = `${datetime.year}`; 

    if (datetime.month) { 
    dateString += `-${datetime.month}`; 
    if (datetime.day) { 
     dateString += `-${datetime.day}`; 
     if (datetime.hour) { 
     dateString += `T${datetime.hour}`; 
     if (datetime.minute) { 
      dateString += `:${datetime.minute}`; 
      if (datetime.second) { 
      dateString += `:${datetime.second}`; 
      } 
     } 
     } 
    } 
    } 

    return `${dateString}Z`; 
} 

을 정말 내가로서 기능하는 경우 중첩에 대한 필요성을 제거 할 수있는 방법을 모르겠어요를 이전 항목이있는 경우에만 타임 스탬프의 각 요소를 작성해야합니다 (datetime 객체에서 문자열/숫자로 제공됩니다.

이에 어떤 도움을 주시면 감사하겠습니다 :)

+0

왜 이들을 처음에 중첩해야합니까? – charlietfl

+0

코드가 작동하는 경우 [codereview.se]에서이 질문을하는 것이 더 좋을 수 있지만 [meta.codereview.se] ... –

답변

1

당신은 그들을 배열과 루프의 값을 넣을 수 :

하지만 주석에서 언급 한 바와 같이
// Just for brevity in this example 
var dt = datetime; 
// Put all the units you want checked in this array 
var units = [dt.month, dt.day, dt.hour, dt.minute, dt.second]; 

var dateString = dt.year 
// Then loop over the array... 
for (let unit of units) { 
    //... checking and adding like you were before 
    if (unit) { 
     dateString += `-${unit}`; 
    } else { 
     // So the rest of the object gets ignored 
     break; 
    } 
} 

, 이것은 동일한 구분 기호를 사용 각 unit. 그것은 복잡성의 소량이 문제를 해결하기 위해 추가 :

// Each unit is paired with the delimiter that should be used on its left 
var units = [[dt.month, "-"], [dt.day, "-"], [dt.hour, "T"], 
      [dt.minute, ":"], [dt.second, ":"]]; 

var dateString = dt.year 
// Deconstruct out the unit and the delimiter 
for (let [unit, delim] of units) { 
    if (unit) { 
     dateString += delim + `${unit}`; 
    } else { 
     break; 
    } 
} 

을 코드의 모든 지점이 매우 용이하게 추출 할 수 기본적으로 if (x) y += x의 형태를 취입니다. 거의 똑같은 일을 반복한다면 루프에 도달하도록 노력하십시오.

+0

시간 구성 요소에 대한 다른 구분 기호 – charlietfl

+0

@charlietfl Eww, 맞아. 나는 그것을 놓쳤다. 나는 내 노트북을 타고 고쳐 줄거야. – Carcigenicate

+0

조각이없는 경우'dateString'을 만드는 것을 중단해야하기 때문에 그가 필요로하는 것이 아닙니다. 이 코드는 dt.month가 누락 되어도 dt.minute가있는 경우 계속해서 문자열을 작성합니다. 아마도 'else break'를 추가하여 for-loop를 끝낼 수 있다면 뭔가 빠졌습니까? –