10 個驚艷的 CoffeeScript 單行代碼
1.數(shù)組中的每個元素乘以2
Marcus從炫耀 map 函數(shù)開始。我們可以使用字面范圍和匿名函數(shù)做到完全相同的事情:
[1..10].map (i) -> i*2
更多表現(xiàn)形式
i * 2 for i in [1..10]
2.數(shù)組中的元素求和
Javascript(以及CoffeeScript的擴展),也有本地map和reduce函數(shù):
[1..1000].reduce (t, s) -> t + s
(reduce == reduceLeft, reduceRight 也可)
3.驗證word在字符串中是否存在
非常容易,因為方法不止一種。如果數(shù)組中的任何元素滿足函數(shù)的話就返回true:
wordList = ["coffeescript", "eko", "play framework", "and stuff", "falsy"]
tweet = "This is an example tweet talking about javascript and stuff."
wordList.some (word) -> ~tweet.indexOf word
返回匹配的word:
wordList.filter (word) -> ~tweet.indexOf word
~ 在CoffeeScript中不是一個特殊的運算符,只是一個鬼把戲而已。它是一個按位取非運算符,即反轉操作數(shù)的二進制數(shù)字。在實踐中它相當于-X-1。這里它的工作原理是檢查索引是否大于-1,并且 – ( – 1)-1 == 0計算為false。
4.讀取文件
JavaScript框架的客戶端用戶熟悉這個一種思路:
fs.readFile 'data.txt', (err, data) -> fileText = data
你也可以使用同步版本:
fileText = fs.readFileSync('data.txt').toString()
在Node.js中,這僅接受應用程序的啟動程序。你應該在你的代碼中使用異步版本。
5.生日快樂
首先,輸出一個1對1的映射集合,并在中間混合插入一小段字符串:
[1..4].map (i) -> console.log "Happy Birthday " + (if i is 3 then "dear Robert" else "to You")
但這樣更好。讀起來像偽代碼:
console.log "Happy Birthday #{if i is 3 then "dear Robert" else "to You"}" for i in [1..4]
6.過濾數(shù)組中的數(shù)字
過濾數(shù)組中的數(shù)字分為兩類。有文化的方式:
(if score > 60 then (passed or passed = []) else (failed or failed = [])).push score for score in [49, 58, 76, 82, 88, 90]
(感謝@giacecco幫助縮短了此處的代碼)
以及函數(shù)式方法:
[passed, failed] = [49, 58, 76, 82, 88, 90].reduce ((p,c,i) -> p[+(c < 60)].push c; p), [[],[]]
7.獲取并解析一個XML Web服務
XML是什么?不曾聽說過。那么不妨使用requst庫獲取JSON:
request.get { uri:'path/to/api.json', json: true }, (err, r, body) -> results = body
8.在數(shù)組中查找最?。ɑ蜃畲螅┲?/strong>
apply 函數(shù)用在這里非常方便。它允許你調(diào)用一個函數(shù),傳遞數(shù)組作為參數(shù)列表:Math.max 和Math.min 都可以接收數(shù)量可變的參數(shù),即Math.max 30, 10, 20 返回30。放到數(shù)組中:
Math.max.apply @, [14, 35, -7, 46, 98] # 98
Math.min.apply @, [14, 35, -7, 46, 98] # -7
9.并行處理
我還沒有想到。你可以自己創(chuàng)建子進程,并與它們溝通,或者使用WebWorkers API實現(xiàn)。跳過。
10.埃拉托斯特尼篩法
無法把它減縮到一行代碼。思路是這樣的?
sieve = (num) ->
numbers = [2..num]
while ((pos = numbers[0]) * pos) <= num
delete numbers[i] for n, i in numbers by pos
numbers.shift()
numbers.indexOf(num) > -1
更新(6月/5日):@dionyziz發(fā)給我這個精簡版本:
primes = []
primes.push i for i in [2..100] when not (j for j in primes when i % j == 0).length
然后我們可以使用到真正的單行代碼,就像原來的那個一樣:
(n) -> (p.push i for i in [2..n] when not (j for j in (p or p=[]) when i%j == 0)[0]) and n in p
或在某種程度上更高效
(n) -> (p.push i for i in [2..n] when !(p or p=[]).some((j) -> i%j is 0)) and n in p
11.其他
大多數(shù)可讀的fizzbuzz版本,你可以看到:
"#{if i%3 is 0 then 'fizz' else ''}#{if i%5 is 0 then 'buzz' else ''}" or i for i in [1..100]
編輯:通過一個小提示使之更簡單,但更有技巧:
['fizz' unless i%3] + ['buzz' unless i%5] or i for i in [1..100]
當你在數(shù)組中使用 + 運算符時,它會轉換為字符串。[].toString()和[].join(',')相同,它在數(shù)組值undefined或null情況下,給出一個空的字符串。這也適用于Javascript([undefined] + "b" === "b")。
更多建議: