2017-12-24 15 views
1

こんにちは私は、私が呼んでいるAPIの行に部分的なISOタイムスタンプを構築するように設計された関数を持っています。私は本当に私はそれとしてであれば、ネストされた機能の必要性を取り除くことができるかわからないこのJavaScriptのタイムスタンプビルダー関数の複雑さ/ネストされたifsを減らす方法

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`; 
} 

:それは返す必要があり、タイムスタンプ:

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

私は次のようにこれは実行するために使用するコード前の項目が存在する場合は、タイムスタンプの各要素を作成する必要があります( 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が残っていれば、このコードは文字列を作成し続けます。恐らく何かがない場合にfor-loopを終了するために 'else break;'を追加したとしますか? –

関連する問題