转换" $。每个(数据,函数(索引)"到coffeescript?

时间:2014-05-03 06:31:12

标签: javascript jquery arrays coffeescript

我无法将其从Jquery / Javascript转换为coffeescript,因为我是一名初学者而且我发现很难掌握。有人可以帮我一把吗?

    $.each(data, function (index) {
        arrayOfThings.push(data[index].thing);
    });

这是一个接收AJAX'GET'数据的函数。

2 个答案:

答案 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)

或使用pushCoffeeScript splat

a.push((e.thing for e in data)...)

您可以将最后两个(即concat和splat / push)与$.mapArray.prototype.map版本合并。

演示:http://jsfiddle.net/ambiguous/Jq6Mh/2/

答案 1 :(得分:1)

这就是我要做的事情(虽然有一些选择你可以做到括号等等。

$.each data, (index) ->
    arrayOfThings.push(data[index].thing)

最大的区别是缺少javascript的function(){}语法,而是使用coffeescript的() ->语法。还可以删除一些括号(可选),当然还有分号。