CoffeeScript攻略4.3:取得陣列最大值

CoffeeScript Cookbook發表於2011-12-03

問題

你需要找出陣列中包含的最大的值。

方案

在ECMAScript 5中,可以使用Array的reduce方法。而在之前版本的JavaScript實現中,要在列表推導基礎上使用Math.max:

# ECMAScript 5
[12,32,11,67,1,3].reduce (a,b) -> Math.max a, b
# => 67

# EC5之前的實現
max = Math.max(max or= num, num) for num in [12,32,11,67,1,3]
# => [ 12, 32, 32, 67, 67, 67 ]
max
# => 67

討論

Math.max在這裡比較兩個數值,返回其中較大的一個;本攻略(兩種方案)的其他程式碼的目的就是遍歷陣列,找出其中最大的值。有意思的是,在用列表推導的結果賦值時,所賦值為上一次比較得到的值,但賦值表示式本身(比如在node.js的CoffeScript直譯器中)在列表推導過程中也會被求值,並生成一個包含每次比較結果的完整對映1。這就意味著在EC5之前的實現中,會產生兩個陣列。

在ECMAScript 4中,對於非常大的陣列,更節省記憶體的方法就是將max初始化為陣列的第一個元素,然後使用普通的for迴圈來遍歷陣列。因為在這本CoffeeScript攻略中不鼓勵大家使用非CoffeeScript技巧,所以讀者可以自己去練習。

1《CoffeeScript語言參考》:在把推導的結果賦值給變數時,CoffeeScript會把每次迭代的結果收集到一個陣列中。——譯者注


enter image description here

相關文章