使用$.each 可以更简洁地执行该循环。 $.each 将回调函数传递给索引和元素,所以你可以说:
$.each data, (index, e) ->
arrayOfThings.push(e.thing)
$.each 还将 this(在 CoffeeScript 中也称为 @)设置为当前元素,因此您也可以说:
$.each data, -> arrayOfThings.push(@thing)
并完全忽略回调参数。
由于您的$.each 有效地解开数组,您可以使用$.map 而不是$.each 来简化回调:
arrayOfThings = $.map data, (e) -> e.thing
CoffeeScript 函数具有隐式返回,因此 -> x 与 -> return x 相同,这对于像这样的小型映射函数很方便。
如果你可以假设一个合理合理的 JavaScript 环境,那么你可以使用原生的Array.prototype.map 而不是 jQuery 的版本:
arrayOfThings = data.map (e) -> e.thing
CoffeeScript 中的循环是产生数组的表达式(有关详细信息,请参阅文档中的 Loops and Comprehensions)。这意味着您可以完全跳过$.each 并使用for ... in 循环:
a = (e.thing for e in data)
假设data 是一个数组。如果data 是具有对象值的对象,那么您可以使用for ... of 循环:
a = (v.thing for k, v of data)
如果你已经有一个数组并且想要添加新的东西,你可以使用concat:
a = a.concat(e.thing for e in data)
或使用push 和CoffeeScript splat:
a.push((e.thing for e in data)...)
您也可以将最后两个(即concat 和splat/push)与$.map 和Array.prototype.map 版本结合起来。
演示:http://jsfiddle.net/ambiguous/Jq6Mh/2/