【问题标题】:How to create two arrays in the same loop with CoffeeScript?如何使用 CoffeeScript 在同一个循环中创建两个数组?
【发布时间】:2013-02-23 17:45:06
【问题描述】:

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

这种方法看起来计算效率不错但是有两行 乙 = [] c = [] 必须先写。我不想写这两行,但我还没有找到答案的好主意。如果没有初始化 b 和 c 的数组,我们就不能使用 push 方法。

是否存在存在运算符?在 Coffeescript 中,但我不知道在这个问题中使用它很热。您是否有更好的方法来创建 b 和 c 的数组而无需显式初始化?

谢谢!

【问题讨论】:

  • 也许b = c = []会更合适?
  • 谢谢。对于 b 和 c,您将得到相同的结果。答案是错误的。
  • @varnie:不行,数组需要分开,内容不一样。
  • 怎么样[b, c] = [[],[]];
  • [b,c] =[[],[]] 有效,但仍被困在许多括号中。

标签: javascript arrays coffeescript push


【解决方案1】:

您可以从underscore(或任何其他提供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 ] ]

有关更多详细信息和示例,请参阅 CoffeeScript 文档中的 section about splats

【讨论】:

  • 非常有趣,但这确实是一个挑战。我没有得到正确的答案。谢谢。
  • 我已经用我得到的结果更新了我的答案。是不是错了?
  • 非常感谢。我也得到了同样的结果。我忘记了行尾的三个点。我不太了解三个点的用法。非常感谢。
  • 来自 CoffeeScript 文档:“JavaScript 参数对象是处理接受可变数量参数的函数的一种有用方式。CoffeeScript 提供了 splats ...,用于函数定义和调用,使变量论点的数量更可口”。有关详细信息和示例,请参阅docs
  • 非常感谢您的友好建议。似乎必须将 splats 用作函数的参数,例如 _.zip。我会尝试更多地练习它。
【解决方案2】:

如何使用存在运算符:

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}"

编辑:来自 cmets:

好的,但是您必须编写很多乏味的代码。同样的原因是 也适用于` (b = b or []).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}"

【讨论】:

  • 好的,但是你必须写很多乏味的代码。 ` (b = b or []).push [i, i*2] ` 也是同样的原因
  • 太复杂了。仍然没有比使用b =[]c = [] 分别初始化它们更好的方法。我想知道是否有一些方法可以结合我提到的第一种和第二种方法。我们可能需要修改数组的 push 方法的定义,使其具有初始值。
  • 我同意明确的定义绝对是最简单的,也最容易理解。我不想扩展 .push 功能,看起来更麻烦。
  • 我也是。非常感谢您的好意建议。
猜你喜欢
  • 1970-01-01
  • 2018-04-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-11
  • 1970-01-01
相关资源
最近更新 更多