Javascript 如何使用CoffeeScript在同一个循环中创建两个数组?

Javascript 如何使用CoffeeScript在同一个循环中创建两个数组?,javascript,arrays,coffeescript,push,Javascript,Arrays,Coffeescript,Push,我想同时创建两个数组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] ale

我想同时创建两个数组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的数组


谢谢大家!

使用存在运算符如何:

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或[])。按[i,i*2]

这很乏味,因此我们可以将其封装在函数中(但请注意,变量现在将是全局变量):


您可以使用
下划线
(或提供类似
zip功能的任何其他库)中的一些帮助:

执行后,我们有:

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文档中的。

也许
b=c=[]
更合适?谢谢。对于b和c,您将得到相同的结果。答案是错误的。@varnie:不,数组需要分开,而且它们的内容不同。那么[b,c]=[[],[]<代码>[b,c]=[],[]]
可以工作,但仍然被困在许多参数中。好的,但是你必须编写这么多乏味的代码。同样的原因也适用于`(b=b或[])。推[i,i*2]`太复杂了。仍然没有比使用
b=[]
c=[]
分别初始化它们更好的方法了。我想知道是否有一些方法可以将我提到的第一种和第二种方法结合起来。我们可能需要修改数组的push方法的定义,使其具有初始值。我同意显式定义肯定是最简单的,也是最容易理解的。我不想扩展.push功能,看起来更混乱。我也是。非常感谢你的善意建议。非常有趣,但这确实是一个挑战。我没有得到正确的答案。谢谢。我已经用我得到的结果更新了我的答案。不对吗?非常感谢。我也得到了同样的结果。我忘了这行末尾的三个点。我不太明白这三个点的用法。非常感谢。来自CoffeeScript文档:“JavaScript arguments对象是处理接受可变数量参数的函数的有用方法。CoffeeScript为函数定义和调用提供splats…,使可变数量的参数更容易接受”。有关详细信息和示例,请参阅。非常感谢您的建议。似乎splats必须用作函数的参数,例如uz.zip。我会尝试用它多练习。
[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 ] ]