将"$ .each(数据,函数(索引)"转换为coffeescript?

eyg*_*grr 0 javascript arrays jquery coffeescript

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

    $.each(data, function (index) {
        arrayOfThings.push(data[index].thing);
    });
Run Code Online (Sandbox Code Playgroud)

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

mu *_*ort 5

有更简洁的方法可以使用循环$.each.$.each传递回调函数索引元素,所以你可以说:

$.each data, (index, e) ->
    arrayOfThings.push(e.thing)
Run Code Online (Sandbox Code Playgroud)

$.each还将this(@CoffeeScript中的AKA )设置为当前元素,这样您也可以说:

$.each data, -> arrayOfThings.push(@thing)
Run Code Online (Sandbox Code Playgroud)

并完全忽略回调参数.

由于您$.each实际上是在展开数组,因此您可以使用$.map而不是$.each简化回调:

arrayOfThings = $.map data, (e) -> e.thing
Run Code Online (Sandbox Code Playgroud)

CoffeeScript函数具有隐式返回,因此-> x相同-> return x,这对于像这样的小映射函数很方便.

如果你可以假设一个合理合理的JavaScript环境,那么你可以使用native Array.prototype.map而不是jQuery的版本:

arrayOfThings = data.map (e) -> e.thing
Run Code Online (Sandbox Code Playgroud)

CoffeeScript中的循环是产生数组的表达式(有关详细信息,请参阅文档中的循环和理解).这意味着您可以$.each完全跳过并使用for ... in循环:

a = (e.thing for e in data)
Run Code Online (Sandbox Code Playgroud)

假设这data是一个数组.如果data是具有对象值的对象,那么您可以使用for ... of循环:

a = (v.thing for k, v of data)
Run Code Online (Sandbox Code Playgroud)

如果你已经有一个数组并希望添加新的东西,你可以使用concat:

a = a.concat(e.thing for e in data)
Run Code Online (Sandbox Code Playgroud)

或使用pushCoffeeScript splat:

a.push((e.thing for e in data)...)
Run Code Online (Sandbox Code Playgroud)

您可以将最后两个(即concatsplat/push)与$.mapArray.prototype.map版本组合在一起.

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