【问题标题】:How to convert arguments to an array in coffeescript?如何将参数转换为咖啡脚本中的数组?
【发布时间】:2013-07-27 20:34:39
【问题描述】:

我有一个函数应该返回除第一个参数以外的所有参数

foo = -> arguments[1..]

foo(0,1,2,3,4)

不幸的是,arguments 不是一个数组而是一个对象。

将对象转换为数组的最佳方法是什么?

【问题讨论】:

    标签: arrays coffeescript


    【解决方案1】:

    找到的是使用Array.prototype.slice:

    coffee> foo = -> Array.prototype.slice.apply(arguments)[1..]
    [Function]
    coffee> foo(0,1,2,3,4)
    [ 1, 2, 3, 4 ]
    

    另一个版本是

    [].slice.call(arguments)
    

    【讨论】:

    • 你可以用::代替prototype:Array::slice.apply...
    【解决方案2】:

    有一些 CoffeeScript-ish 选项使用 splat 来处理数组化 arguments。你可以使用slice:

    f = (args...) -> args.slice(1)
    

    Demo

    或者您可以使用range 而不是直接调用slice

    f = (args...) -> args[1..-1]
    

    Demo

    你可以简化第二个版本because

    切片索引具有有用的默认值。省略的第一个索引默认为零,省略的第二个索引默认为数组的大小。

    所以你可以不用-1,直接说:

    f = (args...) -> args[1..]
    

    相反。感谢scar3tt 指出这一点。

    【讨论】:

    • @Wex: 是的,但我认为对于(args...) 的“我是一个可变参数函数”的明确性,直接使用arguments 并不总是能给你带来好处。跨度>
    • 有趣的是,args... 本质上是被咖啡脚本编译器变成了[].slice.call(arguments)
    • CoffeeScript 允许省略某个范围内的一个或两个索引 (source)。 args[1..-1] 对我来说有点不必要的混乱。我的偏好是改用args[1..]。我确实承认,在撰写答案时可能并非如此。
    • @scarl3tt:我想我错过了。我可以在 ChangeLog 中找到的唯一相关内容是“现在允许省略切片的两个端点以保持一致性,从而有效地创建列表的浅表副本。”那是从 2012 年 4 月 10 日的 1.3.1 开始(即在这个答案之前大约一年)。让我稍微修补一下。
    【解决方案3】:

    您可以忽略第一个参数并使用 splats 捕获其余参数:

    foo = (_, rest...) -> rest 
    

    您也可以执行foo = (args...) -> args[1...] 之类的操作,但那将是compile toArray#slice (unlike the first snippet) 的两次不同调用。

    【讨论】:

    • 如果我只想忽略其余的论点,这是一个很好的答案。我使用[1...] 只是为了说明我不能进行数组操作...
    • @Michael_Scharf,哈哈,好的。那么是的,在 CoffeeScript 中将 arguments 视为数组的惯用方法是简单地将函数声明为 (args...) ->,然后使用 args 这是一个真正的数组。
    猜你喜欢
    • 1970-01-01
    • 2019-03-03
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 2013-11-21
    • 2013-09-03
    • 2013-05-29
    • 1970-01-01
    相关资源
    最近更新 更多