我想同时创建两个数组b和c。我知道有两种方法可以实现它。第一种方法是
b = ([i, i * 2] for i in [0..10])
c = ([i, i * 3] for i in [0..10])
alert "b=#{b}"
alert "c=#{c}"
此方法非常便于创建一个数组。我无法获得更好的计算性能。
第二种方法是
b = []
c = []
for i in [0..10]
b.push [i, i*2]
c.push [i, i*3]
alert "b=#{b}"
alert "c=#{c}"
这种方法似乎对计算效率有好处,但有两行 b = [] c = [] 必须先写。我不想写这两行,但我没有找到一个好主意得到答案。如果没有b和c数组的初始化,我们就不能使用push方法。
存在存在的算子吗?在Coffeescript但我不知道在这个问题上使用它很热。在没有显式初始化的情况下,您是否有更好的方法来创建b和c的数组?
谢谢!
答案 0 :(得分:4)
您可以使用underscore
(或提供zip
的任何其他lib - 类似功能)的一些帮助:
[b, c] = _.zip ([[i, i * 2], [i, i * 3]] for i in [0..10])...
执行后我们有:
coffee> b
[ [ 0, 0 ],
[ 1, 2 ],
[ 2, 4 ],
[ 3, 6 ],
[ 4, 8 ],
[ 5, 10 ],
[ 6, 12 ],
[ 7, 14 ],
[ 8, 16 ],
[ 9, 18 ],
[ 10, 20 ] ]
coffee> c
[ [ 0, 0 ],
[ 1, 3 ],
[ 2, 6 ],
[ 3, 9 ],
[ 4, 12 ],
[ 5, 15 ],
[ 6, 18 ],
[ 7, 21 ],
[ 8, 24 ],
[ 9, 27 ],
[ 10, 30 ] ]
有关详细信息和示例,请参阅CoffeeScript文档中的section about splats。
答案 1 :(得分:1)
使用存在运算符如何:
for i in [0..10]
b = [] if not b?.push [i, i*2]
c = [] if not c?.push [i, i*3]
console.log "b=#{b}"
console.log "c=#{c}"
或者更容易理解:
for i in [0..10]
(if b? then b else b = []).push [i, i*2]
(if c? then c else c = []).push [i, i*3]
console.log "b=#{b}"
console.log "c=#{c}"
编辑:来自评论:
好的,但你必须编写这么多繁琐的代码。同样的道理是 也适用于`(b = b或[])。push [i,i * 2]
这很乏味,所以我们可以把它包装在一个函数中(但要注意变量现在是全局的):
# for node.js
array = (name) -> global[name] = global[name] or []
# for the browser
array = (name) -> window[name] = window[name] or []
for i in [0..10]
array('b').push [i, i*2]
array('c').push [i, i*3]
console.log "b=#{b}"
console.log "c=#{c}"