CoffeeScript
23
匹配字符串
问题
你想要匹配两个或多个字符串。
解决方案
计算把一个字符串转换成另一个字符串所需的编辑距离或操作数。levenshtein = (str1, str2) ->l1 = str1.lengthl2 = str2.lengthprevDist = [0..l2]nextDist = [0..l2]for i in [1..l1] by 1nextDist[0] = ifor j in [1..l2] by 1if (str1.charAt i-1) == (str2.charAt j-1
36
对象的链式调用
问题
你想调用一个对象上的多个方法,但不想每次都引用该对象。
解决方案
在每次链式调用后返回this(即@)对象class CoffeeCupconstructor: ->@properties=strength: 'medium'cream: falsesugar: falsestrength: (newStrength) ->@properties.strength = newStrengththiscream: (newCream) ->@prop
15
命令模式
问题
你需要让另一个对象处理你自己的可执行的代码。
解决方案
使用Command pattern传递函数的引用。# Using a private variable to simulate external scripts or modules
incrementers = (() ->privateVar = 0singleIncrementer = () ->privateVar += 1doubleIncrementer = () ->privateVar += 2com
24
数组最大值
问题
你需要找出数组中包含的最大的值。
解决方案
你可以使用JavaScript实现,在列表推导基础上使用Math.max():Math.max [12, 32, 11, 67, 1, 3]...
# => 67
另一种方法,在ECMAScript 5中,可以使用Array的reduce方法,它与旧的JavaScript实现兼容。# ECMAScript 5
[12,32,11,67,1,3].reduce (a,b) -> Math.max a, b
# => 67
31
CoffeeScrip 的 type 函数
问题
你想在不使用typeof的情况下知道一个函数的类型。(要了解为什么typeof不靠谱,请参见 http://javascript.crockford.com/remedial.html。)
解决方案
使用下面这个type函数type = (obj) ->if obj == undefined or obj == nullreturn String objclassToType = {'[object Boolean]': 'b
25
找到一个月中的最后一天
问题
你需要去找出一个月的最后一天,但是一年中的各月并没有一个固定时间表。
解决方案
利用JavaScript的日期下溢来找到给出月份的第一天:now = new Date
lastDayOfTheMonth = new Date(1900+now.getYear(), now.getMonth()+1, 0)
讨论
JavaScript的日期构造函数成功地处理溢出和下溢情况,使日期的计算变得很简单。鉴于这种简单操作,不需要担心一个给定的月份里有多少天;只需要用数学稍加推导。在十二
28
工厂方法模式
问题
直到开始运行你才知道需要的是什么种类的对象。
解决方案
使用工厂方法(Factory Method)模式和选择对象都是动态生成的。
你需要将一个文件加载到编辑器,但是直到用户选择文件时你才知道它的格式。一个类使用工厂方法 ( Factory Method )模式可以根据文件的扩展名提供不同的解析器。class HTMLParserconstructor: ->@type = "HTML parser"
class MarkdownParserconstruct
27
更快的 Fibonacci 算法
问题
你想计算出Fibonacci数列中的数值N ,但需迅速地算出结果。
解决方案
下面的方案(仍有需改进的地方)最初在Robin Houston的博客上被提出来。
这里给出一些关于该算法和改进方法的链接: http://bosker.wordpress.com/2011/04/29/the-worst-algorithm-in-the-world/
http://www.math.rutgers.edu/~erowland/fibonacci
http: