CoffeeScript中是否有类似于NumPy的重复功能?

时间:2013-02-27 07:45:27

标签: javascript coffeescript

在NumPy中,您可以轻松创建一个重复值的数组。如下所示。

>> print np.arange(3).repeat(2)
[0 0 1 1 2 2]

有没有办法在CoffeeScript中执行此操作?

更新: 根据Marius在回答中提出的建议,我创建了一个简单的函数来自动执行重复操作。这适用于将来遇到同一问题的任何人。

repeat = (arr, repeats) ->
    newArr = for a in arr
        a for [0...repeats]
    return [].concat.apply [], newArr

2 个答案:

答案 0 :(得分:3)

不直接。这很丑陋,但有效:

arr = for a in [0..2]
  a for [0..1]

console.log arr
console.log [].concat.apply [], arr

输出:

[ [ 0, 0 ], [ 1, 1 ], [ 2, 2 ] ]
[ 0, 0, 1, 1, 2, 2 ]

第一个块创建嵌套数组,concat.apply(javascript)方法展平它。

为了完整性(参见注释),这里是CS“漂亮”版本,但请注意它创建了另一种数组(它以不同的顺序执行循环):

arr = (a for a in [0..2] for [0..1])

console.log arr
console.log [].concat.apply [], arr

输出:

[ [ 0, 1, 2 ], [ 0, 1, 2 ] ]
[ 0, 1, 2, 0, 1, 2 ]

最后一个示例与您的代码无法直接比较,但无论如何都可以使用,具体取决于您真正想要实现的目标。

关于CS有很多值得关注的东西,但我讨厌的两件事情是:1)总是不得不使用空格用于块(无法使我的第一个例子成为单行),以及2)没有对象理解(不是与这个例子有关)。

答案 1 :(得分:2)

CoffeeScript与语言本身有关。您正在寻找的是图书馆支持。没有像NumPy那样全面的东西,它仍然没有repeat()函数,但你至少可以在Underscore.js中找到几个(有些)相关的函数。 Lemonad对于某些相关任务看起来也很有希望。