7

2つの配列bとcを同時に作成したいと思います。私はそれを達成することができる2つの方法を知っています。最初の方法は

b = ([i, i * 2] for i in [0..10])
c = ([i, i * 3] for i in [0..10])

alert "b=#{b}"
alert "c=#{c}"

この方法は、1つの配列のみを作成する場合に非常に便利です。計算のパフォーマンスを向上させるためのより良い方法はありません。

2番目の方法は

b = []
c = []
for i in [0..10]
  b.push [i, i*2]
  c.push [i, i*3]

alert "b=#{b}"
alert "c=#{c}"

この方法は計算効率には良いようですが、最初に2行b = [] c=[]を記述する必要があります。この2行は書きたくないのですが、答えを出すのに良いアイデアが見つかりません。bとcの配列の初期化がないと、pushメソッドを使用できません。

存在演算子は存在しますか?Coffeescriptでですが、この問題でそれを使用するのが辛いのかわかりません。明示的な初期化なしでbとcの配列を作成するためのより良い方法はありますか?

ありがとうございました!

4

2 に答える 2

4

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 ドキュメントのスプラットに関するセクションを参照してください。

于 2013-03-08T12:53:28.713 に答える
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 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}"
于 2013-03-08T09:26:10.250 に答える