2011-06-20 80 views
178

我有一个对象(一个“副阵列”,也被称为纯Javascript对象):遍历对象中的CoffeeScript

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

,我需要使用的CoffeeScript在它进行迭代。现在,这样做:

for elem in obj 

不起作用,因为obj.length是0,编译js代码使用。在正常的JavaScript我只会做

for(var key in obj) 

但现在我想知道:我怎么能做到这一点在咖啡脚本?

+4

“阵列” 是特殊的对象与数字索引和一个'length'属性它只是指最高的数值指数(加上1)。你想要的只是一个“对象”:'obj = {}'。数组是对象,但在示例中没有理由使用它。 –

+1

好点Trevor!我已经在这方面修改了这个问题,以减少误导/混淆。 –

回答

333

使用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 

您也可以考虑作为在评论中提到的亚伦·杜福尔的变种for own k,v of ages。这增加了一个检查来排除从原型继承的属性,这可能不是在这个例子中的问题,但可能是如果你建立在其他东西之上。

+12

准确。 CoffeeScript的'''编译成JavaScript的'in'。这是一个常见的混淆点,但是与数组配合使用非常有用。我在[CoffeeScript书](http://pragprog.com/titles/tbcoffee/coffeescript)中详细讨论了这个问题。 –

+3

您不应将'arr'初始化为'arr = []',您应该使用'arr = {}'。在Javascript(和Coffeescript)数组中有数字索引。对象的行为类似于关联数组/字典。 –

+0

谢谢,Trevor和其他人已经指出了这一点,我的回答是保持原始问题代码。无论如何,我会将我的示例更新为使用普通对象。 – Nick

4

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

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

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

实际上,JS中的所有*对象都是关联数组(没有一致的键排序)。所以jcmoney给出的代码应该可以工作,尽管在这种情况下没有理由使用'[]'而不是'{}'。 –

+0

http://jashkenas.github.com/coffee-script/#loops看起来像由coffeescript生成的循环不会遍历对象成员。 – kioopi

2

使用数组理解的短手版本,可以用作单线循环。

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

阵列理解是:

“悟替换(和编译成)的for循环,可选 后卫条款和当前数组索引的值不同于用于 循环,阵列内涵是表达式,可以返回并分配 。“ http://coffeescript.org/#loops

+4

。仅仅提供代码片段是不够的。 stackoverflow不是一个“给codez”网站,这个想法是,如果答案提供了对抽象概念的澄清,其他人将会受益更多。 –

+2

“我可以解释” – makdad

1

与你约定,编曲是一rray,但“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 key, val of arr 
    console.log key + ': ' + val 

它返回:在JavaScript/CoffeeScript的

Foo : Bar 
Bar : Foo