2014-02-23 79 views
0

我正在嘗試查找數組中的最大項目。如何在TypeScript中調用數組reduce?

這是很簡單的使用直接,簡單,乾淨,優雅,快速的方法來解決 - 遍歷數組:

private GetMaxValue(data: Array<RealtimeDataPoint>): number { 
    if (data.length === 0) 
     return 0; 

    var maxValue = data[0].Value; 

    for (var i: number = 1; i < data.length; i++) { 
     if (data[i].Value > maxValue) 
      maxValue = data[i].Value; 
    } 

    return maxValue; 
} 

但是,這不是很酷

然後,而不是解決用最簡單的方式問題,我想嘗試使用.reduce解決這個問題:

private GetMaxValue(data: Array<RealtimeDataPoint>): number { 
    var pt: RealtimeDataPoint = data.reduce(function (previousValue: RealtimeDataPoint, currentValue: RealtimeDataPoint, currentIndex: number, array: Array<RealtimeDataPoint>): RealtimeDataPoint { 
     if (currentValue.Value > previousValue.Value) 
      return currentValue; 
     else 
      return previousValue; 
    }); 

    if (pt != null) 
     return pt.Value; 
    else 
     return 0; 
} 

,它的偉大,並將其編譯和所有。但它崩潰在運行時:

對象不支持此操作

這似乎表明,在var pt: RealtimeDataPoint = data.reduce(...)線的東西是不行的,因爲這是其攤位上線:

enter image description here

而且它不是.reduce成員,它不支持,因爲那裏。

於是,兩個問題:

  • 什麼是錯我的語法?
  • 爲什麼TypeScript沒有意識到我的語法有問題?

加成顫振

  • 的Internet Explorer 11
  • 鉻32
+0

您正在使用哪種瀏覽器?你有沒有嘗試在另一個代碼中運行你的代碼? – nemesv

回答

0

解決它。

從Internet Explorer 11的錯誤信息是:

對象不支持此操作

從鉻32的錯誤信息是:

enter image description here

減少沒有初始值的空陣列

由於修復很簡單,從優雅的解決方案借東西:

private GetMaxValue(data: Array<RealtimeDataPoint>): number { 
    if (data.length === 0) 
     return 0; 

    var pt: RealtimeDataPoint = data.reduce(function (previousValue: RealtimeDataPoint, currentValue: RealtimeDataPoint, currentIndex: number, array: Array<RealtimeDataPoint>): RealtimeDataPoint { 
     if (currentValue.Value > previousValue.Value) 
      return currentValue; 
     else 
      return previousValue; 
    }); 

    if (pt != null) 
     return pt.Value; 
    else 
     return 0; 
} 

鑑於reduce模式的詳細程度,以及associated performance penalty,我想我會用優雅的解決方案棒。

但至少現在有一個在TypeScript中的reduce語法的例子。

注意:任何代碼發佈到公共領域。無需歸屬。

+0

Downvote是因爲:1.這是一個非常非常長的帖子,它指出[] .reduce(function(){})是一個運行時錯誤,它甚至不是特定於TypeScript的東西。2.爲什麼你的減少功能有2個額外的未使用的參數? 3.爲什麼你的reduce函數有一堆額外的類型註釋,當它已經在上下文中輸入的時候? 4.原始文章不會告訴我們'數據'中的內容5.「Chrome 32」處於「獎勵喋喋不休」狀態,但它給了您的錯誤信息是問題的答案? –

+0

@RyanCavanaugh由於StackOverflow說,我應該展示研究工作。 a)這是運行時錯誤,我沒有編寫代碼(Typescript編譯器編寫它,也許這是生成的代碼中的問題)b)因爲回調函數簽名應該匹配所需的回調簽名c)因爲我嘗試了有和沒有打字,但仍然失敗d)「數據」中的數據無關緊要;第一種算法在不知道數據是什麼的情況下運行; e)操作順序;我用我試過的瀏覽器更新了這個問題。 –

+0

@RyanCavanaugh哦,還有更重要的一點,如果我們忽視了所有你對此不滿的事情,我不知道我發佈問題時的答案是什麼。一旦你有解決方案,很容易實現解決方案。所以當我沒有解決方案時,我不知道它是否與打字稿相關 - 或者它與哪些相關。結果發現*有*的東西是任意的,在TypeScript中不起作用。 [你會認爲他們會工作,但他們只是沒有](http://stackoverflow.com/questions/12950681/typescript-for-in-statment)。我認爲「減少」是另一種邊緣情況。 –

相關問題