2016-12-26 4 views

ответ

1

Поскольку ваши даты не содержат какой-либо часовой пояс или даже данные о времени, которые будут рассматриваться как часовой пояс UTC. Нам не нужен момент, чтобы помочь нам в этом.

Вы также используете очень длинные ссылки в своем коде, которые затрудняют чтение и больше подвержены ошибкам. (например: data.entryDetails[0].entry_counts[count].entry_counts;) Я бы предложил сократить это, используя некоторые переменные. Это также облегчает проверку правильности или даже значения.

При работе со временем и приращением времени значениеOf очень полезно. Я написал для вас быстрый сценарий. Я уверен, что его можно улучшить с некоторой проверкой ошибок и убедиться, что данные определены. Кроме этого это должно быть полезно для вас!

С праздником!

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

Смежные вопросы