我正在使用coffescript中的一些算法,结果出现了一些意想不到的输出。这是我的代码:
traverse = (tree, stack) ->
stack.push tree.node
if not tree.branches
stack
else
traverse branch, stack for branch in tree.branches
one = { node: 1 }
two = { node: 2 }
tree = { node: "+", branches: [one, two] }
console.log traverse one, [] # => [ 1 ]
console.log traverse two, [] # => [ 2 ]
console.log traverse tree, [] # => [ [ '+', 1, 2 ], [ '+', 1, 2 ] ]
我希望在遍历tree
时获得的输出是[ '+', 1, 2 ]
,但这会得到重复。我在这里想念一些简单的东西吗?
感谢。
答案 0 :(得分:1)
如果函数没有显式return
,则返回值是最后一个表达式的值。函数中的最后一个表达式是:
if not tree.branches
stack
else
traverse branch, stack for branch in tree.branches
请注意,if
和for
都是CoffeeScript中的表达式。
那么if
的值是什么,因此函数的值是多少?如果tree.branches
在那里,那么您获得stack
,否则您将获得for
的值。 CoffeeScript for
循环求值为数组:
a = (i for i in [0 .. 6])
# a is now [0, 1, 2, 3, 4, 5, 6]
因此,如果tree.branches
存在,您最终会返回transverse
返回的数组:数组数组的数组......其中最终数组都是stack
。
你只需要对你的返回值更加明确一点,这样的事情应该可以解决这个问题:
traverse = (tree, stack) ->
stack.push tree.node
if tree.branches
traverse branch, stack for branch in tree.branches
stack # <------------ Now we always return stack