2012-06-22 104 views
1
magnitudeArray = [] 
for index, dataPoint of chartData 
    magnitudeArray.push dataPoint.magnitude if dataPoint.magnitude? 

上面的代码有效,但对于coffeescript它的丑陋和不友善的脚本。首先,index var是完全未使用的,它只是在那里,所以我可以访问dataPoint var作为关联数组的结果而不是索引。也是它的三条线!使用coffeescript循环数组应该可以用一行写入,而不是循环。coffeescript循环通过关联数组

我想象这样的事情是可能的:

magnitudeArray = for dataPoint of chartData when dataPoint.magnitude? 

你知不知道这样做的清洁coffeescriptier方式?

+2

只是让你知道:有没有这样的事情作为关联数组CoffeeScript的/ JavaScript的。你有一个对象。 – Paulpro

+1

javascript中的东西是一个对象。我将它用作关联数组。没有原型,也没有方法。你会怎么说呢? – Fresheyeball

回答

1

是的,在这种情况下,您应该可以使用array comprehension,但您需要为chartData的密钥使用变量,我假设它是一个对象。您可以使用_表示未使用的变量(虽然我不知道这是在CoffeeScript中常见的做法):

magnitudes = (point.magnitude for _, point of chartData when point.magnitude?) 

Example at coffeescript.org

+0

我看过这个例子,但没有找到像你一样有括号的例子。这只是使咖啡精彩的一种表达方式。谢谢。 – Fresheyeball

+0

对不起,示例链接有错误。在coffeescript.org中有几个用于理解的数组生成的例子,比如'countdown =(num [10..1]中的num]',但我会同意它不是那么明显,在[10..1]中执行'countdown = num',其中'countdown'将最终变为'1':P – epidemian

1

您可以使用“解构分配”来压缩下来多一点

magnitudes = (magnitude for i, {magnitude} of chartData when magnitude?) 

甚至

magnitudes = (m for i, {magnitude: m} of chartData when m?) 
+0

我不认为这是正确的。试用'chartData = {a:{magnitude:8},b:{stuff:10},c:{magnitude:10}}',我相信这是OP的意图。你的工作就像'chartData = [{magnitude:8},{stuff:10},{magnitude:10}]' – 2012-06-22 09:18:51

+0

确实,我刚才假设'chartData'是一个数组而不是一个对象,被忽略。但OP称之为'联想阵列',我认为它是一个对象。编辑。 – nicolaskruchten