【问题标题】:How to iterate over the keys and values in an object in CoffeeScript?如何在 CoffeeScript 中迭代对象中的键和值?
【发布时间】:2011-09-18 12:28:30
【问题描述】:

我有一个对象(可以说是“关联数组” - 也称为纯 JavaScript 对象):

obj = {}
obj["Foo"] = "Bar"
obj["bar"] = "Foo"

我想使用 CoffeeScript 遍历 obj,如下所示:

# CS
for elem in obj

上面的CS代码编译成JS:

// JS
for (i = 0, len = obj.length; i < len; i++)

在这种情况下不合适。


JavaScript 方式是 for(var key in obj),但现在我想知道:我如何在 CoffeeScript 中做到这一点?

【问题讨论】:

  • "Arrays" 在 JavaScript/CoffeeScript 中是具有数字索引的特殊对象和一个简单地引用最高数字索引(加 1)的 length 属性。你想要的只是一个“对象”:obj = {}。数组是对象,但没有理由在您的示例中使用一个。
  • 好点特雷弗!在这方面,我已经修改了这个问题,以减少误导/混淆。

标签: javascript coffeescript


【解决方案1】:

使用for x,y of LRelevant documentation.

ages = {}
ages["jim"] = 12
ages["john"] = 7

for k,v of ages
  console.log k + " is " + v

输出

jim is 12
john is 7

您可能还需要考虑 Aaron Dufour 在 cmets 中提到的变体 for own k,v of ages。这会添加一个检查以排除从原型继承的属性,这在本示例中可能不是问题,但如果您在其他东西之上构建可能会出现问题。

【讨论】:

  • 没错。 CoffeeScript 的 of 编译为 JavaScript 的 in。这是一个常见的混淆点,但是将in 与数组一起使用非常有用。我在the CoffeeScript book 详细讨论了这个问题。
  • 你不应该将arr初始化为arr = [],你应该使用arr = {}。在 Javascript(和 Coffeescript)中,数组有数字索引。对象的行为类似于关联数组/字典。
  • 谢谢,Trevor 和其他人已经指出了这一点,我的回答是保持原始问题代码。为了清楚起见,我将更新我的示例以使用普通对象。
  • 虽然对于这个特定的例子并不重要,但听起来for own key, value of obj 更接近 OP 正在寻找的东西。
【解决方案2】:

您正在初始化一个数组,但随后您像使用对象一样使用它(js 中没有“关联数组”)。

使用迭代对象的语法(类似):

for key, val of arr
  console.log key + ': ' + val 

【讨论】:

  • 实际上,JS 中的 所有 对象都是关联数组(没有一致的键顺序)。所以 jcmoney 给出的代码应该可以工作,尽管在这种情况下没有理由使用 [] 而不是 {}
  • jashkenas.github.com/coffee-script/#loops 看起来咖啡脚本生成的循环不会遍历对象成员。
【解决方案3】:

使用数组推导的简写版本,可以作为单行循环使用。

console.log index + ": " + elm for index, elm of array

数组理解是:

"理解替换(并编译成)for循环,可选 保护子句和当前数组索引的值。不像 循环,数组推导是表达式,可以返回和 已分配。", http://coffeescript.org/#loops

【讨论】:

  • 请解释一下。仅提供代码 sn-p 是不够的。 stackoverflow 不是“给我代码”网站,其想法是,如果答案提供对抽象概念的澄清,其他人将受益更多。
【解决方案4】:

按照您的约定,arr 是一个数组,但“foo”是该数组的一个属性,它不是索引值。 如果要将数据存储为数组的索引值,则应该编写:

arr1 = []
arr1[0] = "Bar"
arr1[1] = "Foo"

或者如果你想要一个关联数组,只需使用一个对象:

arr2 = {}
arr2["Foo"] = "Bar" // equivalent to arr2.foo="Bar"
arr2["bar"] = "Foo" // equivalent to arr2.bar="Foo"

如果你想循环 arr1 :

str = "values are : "
for val in arr2
  str += val + " |"
console.log key + ': ' + val

返回:

values are : Bar | Foo |

并循环 arr2 : "for value in array"

for key, val of arr
  console.log key + ': ' + val

返回:

Foo : Bar
Bar : Foo

【讨论】:

    猜你喜欢
    • 2021-03-30
    • 2021-12-20
    • 2023-03-06
    • 2021-09-17
    • 1970-01-01
    • 2013-03-21
    • 2023-03-27
    • 2014-12-23
    • 2018-04-06
    相关资源
    最近更新 更多