我无法将其从Jquery / Javascript转换为coffeescript,因为我是一名初学者而且我发现很难掌握。有人可以帮我一把吗?
$.each(data, function (index) {
arrayOfThings.push(data[index].thing);
});
这是一个接收AJAX'GET'数据的函数。
答案 0 :(得分:5)
使用$.each
有更简洁的方法来完成循环。 $.each
传递回调函数索引和元素,因此您可以说:
$.each data, (index, e) ->
arrayOfThings.push(e.thing)
$.each
还会将this
(CoffeeScript中的AKA @
)设置为当前元素,因此您还可以说:
$.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)
a.push((e.thing for e in data)...)
您可以将最后两个(即concat
和splat / push
)与$.map
和Array.prototype.map
版本合并。
答案 1 :(得分:1)
这就是我要做的事情(虽然有一些选择你可以做到括号等等。
$.each data, (index) ->
arrayOfThings.push(data[index].thing)
最大的区别是缺少javascript的function(){}
语法,而是使用coffeescript的() ->
语法。还可以删除一些括号(可选),当然还有分号。