2016-12-26 2 views
0

0:{entry_counts:2000、week_end_date: "2016-09-01"} 1:{entry_counts:10000、week_end_date: "2016-09-08"} 2:{entry_counts:20000 、week_end_date: "2016-09-22"} 3:{entry_counts:40000、week_end_date: "2016-09-29"} 4:{entry_counts:150000、week_end_date: "2016-10-13"}対応する値で日付配列を準備する

答えて

1

あなたの日付にはどんな種類のタイムゾーンや時刻データも含まれていないので、UTCのタイムゾーンとして扱われます。私たちはこのことについて私たちを助ける瞬間は本当に必要ありません。

また、コード内で非常に長い参照を使用しているため、読みにくくなり、エラーが発生しやすくなります。 (例:data.entryDetails[0].entry_counts[count].entry_counts;) これをいくつかの変数を使って切り詰めることをお勧めします。これにより、値が有効か定義されているかどうかを簡単に確認することもできます。

時間と時間を増やして作業する場合、valueOfは非常に便利です。私はあなたのための簡単なスクリプトを書いた。私はそれがいくつかのエラーチェックとデータが定義されていることを確認して改善することができると確信しています。これ以外にも、あなたにとって役に立つはずです!

ハッピーホリデー!

var countData = [ {entry_counts: 2000, week_end_date: "2016-09-01"},{entry_counts: 10000, week_end_date: "2016-09-08"},{entry_counts: 20000, week_end_date: "2016-09-22"},{entry_counts: 40000, week_end_date: "2016-09-29"},{entry_counts: 150000, week_end_date: "2016-10-13"} ] 
 
var today  = (new Date()).valueOf() 
 

 
var currentEntry = parseEntry(countData.shift()) 
 
var nextEntry = parseEntry(countData.length ? countData.shift() : null) 
 

 

 
var viewsArray = [] 
 
var datesArray = [] 
 

 
var time   = currentEntry.dateValue 
 

 
while(time <= today){ 
 
    
 
    // update currentEntry data used to the most up-to-date data we have 
 
    if(nextEntry && time > nextEntry.dateValue) { 
 
     
 
     while(nextEntry && time > nextEntry.dateValue){ 
 
     
 
     currentEntry = nextEntry 
 
     nextEntry = parseEntry(countData.length ? countData.shift() : null) 
 
     
 
     } 
 
     
 
    } 
 
     
 
    viewsArray.push(currentEntry.views) 
 
    datesArray.push(new Date(time)) 
 
    
 
    time += daysInMilliseconds(7) 
 

 
} 
 

 

 
console.log(viewsArray) 
 

 

 
function parseEntry(entry) { 
 
    
 
    if(!entry) return null 
 
    
 
    entry.date  = new Date(entry.week_end_date) 
 
    entry.dateValue = entry.date.valueOf() 
 
    entry.views  = entry.entry_counts 
 
    
 
    return entry 
 
    
 
} 
 

 

 
function daysInMilliseconds(days) { 
 
    
 
    return days * 24 * 60 * 60 * 1000 
 
    
 
}

+0

これは魔法のように動作します!ずっときれいで短く。どうもありがとう! コードを教えてください。そして、私が間違っていたことは? :) –

+1

"*私はそれがローカルタイムゾーン*にあると推測できると思うが、あなたはそうではない。 Dateコンストラクタを使用してISO 8601形式の日付文字列を解析すると、それらはUTCとして扱われるため、 'new Date()'によって作成された日付と比較するとホストタイムゾーンによってシフトされます。あなたはその日の特定の時間に間違った結果を得ます。 – RobG

+0

あなたは正しいです、私はそれを変更しました。 – SnailCrusher

関連する問題