【问题标题】:coffeescript loop through associative array通过关联数组的咖啡脚本循环
【发布时间】:2012-06-22 20:47:35
【问题描述】:
magnitudeArray = []
for index, dataPoint of chartData
     magnitudeArray.push dataPoint.magnitude if dataPoint.magnitude?

上面的代码有效,但对于咖啡脚本来说,它丑陋且不符合咖啡脚本。首先,index var 完全未使用,它就在那里,所以我可以访问 dataPoint var 作为关联数组而不是索引的结果。还有它的三行!使用 coffeescript 循环,数组应该可以用一行写,而不是循环。

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

magnitudeArray = for dataPoint of chartData when dataPoint.magnitude?

你知道更清洁的 coffeescriptier 方法吗?

【问题讨论】:

  • 请注意:Coffeescript/Javascript 中没有关联数组之类的东西。你有一个对象。
  • javascript 中的一切都是对象。我将它用作关联数组。没有原型,也没有方法。你会如何表达它?

标签: coffeescript


【解决方案1】:

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

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

Example at coffeescript.org.

【讨论】:

  • 我看过这个例子,但没有找到像你这样有括号的例子。这正是使coffeescript出色的表达方式。谢谢。
  • 抱歉,示例链接出错。在coffeescript.org 中有几个使用推导式生成数组的示例,例如countdown = (num for num in [10..1]),但我同意执行countdown = num for num in [10..1]countdown 最终会成为只是1:P
【解决方案2】:

您可以使用“解构赋值”来进一步压缩它

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

甚至

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

【讨论】:

  • 我认为这是不对的。尝试使用chartData = {a: {magnitude: 8}, b: {stuff: 10}, c: {magnitude: 10}},我相信这是 OP 的意图。你的适用于chartData = [{magnitude: 8}, {stuff: 10},{magnitude: 10}]
  • 事实上,我刚刚假设 chartData 是一个数组而不是一个对象,因为索引被忽略了。但是 OP 称它为“关联数组”,我认为它是一个对象。已编辑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2012-06-18
  • 1970-01-01
  • 2012-06-14
  • 1970-01-01
  • 2015-12-12
  • 2011-12-16
相关资源
最近更新 更多