为什么这个coffeescript代码不起作用?

时间:2013-10-24 16:14:00

标签: coffeescript

我正在尝试创建一个列出对象的所有属性的函数

showProps = (obj) ->
 result = ""
 result+= String(i+ ' = ' + obj[i] + '\n') for i in obj when obj.hasOwnProperty(i)
 return result
O = {A:1}
alert showProps O

为什么函数什么都不返回?

3 个答案:

答案 0 :(得分:1)

CoffeeScript的for...in循环用于循环数组。要迭代对象,您需要for...of(编译为Javascript的for...in)。

如果您使用

result+= String(i+ ' = ' + obj[i] + '\n') for i of obj when obj.hasOwnProperty(i)

然后你会得到你正在寻找的结果。

正如@muistooshort指出的那样,您可以使用hasOwnProperty在CoffeeScript中免费获取own部分,这使代码更简单:

result+= String(i+ ' = ' + obj[i] + '\n') for own i of obj

答案 1 :(得分:1)

您希望for [own] of - loop迭代属性:

showProps = (obj) ->
 result = ""
 result+= String(i+ ' = ' + v + '\n') for own i, v of obj
 return result
O = {A:1}
alert showProps O

顺便说一句,你不需要明确的String调用,因为你无论如何都要连接字符串,你的整个函数可以更容易地定义为数组理解:

showProps = (obj) ->
  (i+' = '+v  for own i, v of obj).join('\n')

答案 2 :(得分:0)

它不起作用,因为您使用了错误的运算符。 in 旨在用于迭代集合,例如 array 。您想使用 of 运算符。

除了我改变你的例子以使其更像CoffeeScript方式:

showProps = (obj) ->
  result = ""
  result += "#{i} = #{v} \n" for i, v of obj when obj.hasOwnProperty(i)
  result
anObject = A:1
alert showProps anObject