2015-06-24 77 views
0
function statsForDays(data) { 
    var days = {}; 
    var currentDate; 
    var lastValue; 

    for (var i=0, l=data.length; i<l; i++) { 
     var element = data[i]; 
     var timestamp = element[0]; 
     var value = element[1]; 
     var date = new Date(timestamp); 
     if (!lastValue) lastValue = value; 
     if (currentDate != date.getDate()) { 
      currentDate = date.getDate(); 
      days[String(date.getMonth()+1)+'-'+String(currentDate)] = value - lastValue; 

      lastValue = value; 
     } 
    } 

    return days; 
} 

任何人都可以向我解釋上述函數是如何工作的?我知道它是如何產生的,但想知道if (!lastValue) lastValue = value;在函數中做了什麼?它似乎是一種算法,但它是如何工作的?因爲lastvalue被設置爲等於value爲什麼以後在days[String(date.getMonth()+1)+'-'+String(currentDate)] = value - lastValue;之間將它們彼此相關?爲什麼然後再次平等呢?if NOT語句的用法

+4

@freefaller這個問題在這裏是** on-topic ** per [help/on-topic],以及關於程序員的話題。如果您不瞭解其範圍,請不要推薦網站:[** Programmers.SE上發生了什麼? Stack Overflow的指南**](http://meta.programmers.stackexchange.com/questions/7182/what-goes-on-programmers-se-a-guide-for-stack-overflow) – durron597

+0

道歉@ durron597 – freefaller

+0

如果lastValue的值爲undefined,null,「」(空字符串),false,NaN或0,那麼'lastValue'將爲true,因爲每個eval的布爾表示形式爲'false' – Hacketo

回答

0

當循環開始迭代時,它會檢查變量是否等於某個值?如果lastvalue設置更不用說它等於lastvaluevalue或者lastvalue具有一定的值,則第一if聲明沒有做任何事情。

0

循環的每次迭代都記錄每行數據之間的天數差異。但是,對於索引0,沒有「前一個」元素進行比較。當它說「if(!lastValue)」時,意思是「如果最後的值等於0」。然後,它會減去價值,並在天內記錄該差異的0。

0

變量lastValue開始單位化,默認等於undefined。如果lastValue保持未定義,則輸出days的第一個元素的值爲NaN,因爲(value - undefined)的輸出不可避免地會不可估量。

該函數似乎將每個「M-D」與值減去前一天的值一起返回。忽略重複日期:

statsForDays([ 
    [new Date(2015,0,1),3], 
    [new Date(2015,1,2), 4], 
    [new Date(2015,2,3), 11], 
    [new Date(2015,3,5), 5], 
    [new Date(2015,3,5), 5] ] 
      ) 

/* 
Returns: 
Object { 1-1=0, 2-2=1, 3-3=7, 4-5=-6 } 
*/