2012-02-17 11 views
3

私はCoffeescriptを書いていますが、生成されたjavacriptは明白でなければなりません 私は多くの変数で関数を実行したいので、他の場所で読み込まれているオブジェクトのプロパティであるため、結果を保持します。 それはJavascriptが値としてそれらを入れて、参照しないだろうと思われるように、私は唯一の私が欲しいものを実装するには、この醜い方法を発見した:Javascript/Coffeescript:多くの変数で関数を実行して、それをエレガントに変更する方法は?

[@au, @iu, @rdis, @rtres, @rmin, @rmax, @dmil, @dal, @dacc] = 
    [@au, @iu, @rdis, @rtres, @rmin, @rmax, @dmil, @dal, @dacc].map (x) -> x * (0.95 + Math.random()*0.1) 

これを行うのは良い方法はありませんか?

+0

オブジェクトは、値ではなく参照として渡されます。 –

答えて

4

一つの方法は、次のようになります。

for i in ['au', 'iu', ...] 
    this[i] *= 0.95 + Math.random() * 0.1 

また、あなたの代わりにあなたのクラスにそれらの値のオブジェクトを構成することができます:

getRands = -> 
    dict = {} 
    for i in ['au', 'iu', ...] 
    dict[i] *= 0.95 + Math.random() * 0.1 

@vars = getRands() 
+0

ありがとう、それは非常に有用です。 – user1216071

0

リカルド・トマジが言ったように、問題は、あなたがしたいこと、ですインプレースでいくつかの値を変更します。そのためには、自分自身を繰り返したり、Lucianが示唆するように、識別子ではなく文字列を使用する必要があります。

単純なオブジェクトよりも洗練された構造で状態を保存することをお勧めします。各値を独自のオブジェクトラッパーに入れた場合(例:

@au = {val: 5} 

あなたは単にあなたが将来的にこれらのオブジェクトには、追加の状態を保存することを決定するかもしれない

[@au, @iu, @rdis, @rtres, @rmin, @rmax, @dmil, @dal, @dacc].each (o) -> 
    o.val *= (0.95 + Math.random()*0.1) 

を書くことができます。たとえば、あなたがランダムな値は、将来的に何であったか確認したい場合、あなたはまた、(BACKBONE.JSのもののような)イベント化モデルを使用して考えることをお勧めします

o.jitter = Math.random() * 0.1 
    o.val *= (0.95 + o.jitter) 

にイテレータを変えることができるのではなく単純なオブジェクト。

0

私はそうのようにそれについて移動すると思う:

thing = { a:1, b:2, c:3, d:4, e:5 } 
for key, value of thing when key in ['a', 'c', 'd'] 
    thing[key] = value * 2 

、私は非常に多くの場合、異なる方法で同じ値のセットをマングルするつもりだった場合、私はおそらく自分自身のコレクションにそれらを分割したいですよう:

意図明確になるかもしれない、とスタッフの多くを行う機能で、つまり、簡潔にするためにそれへのローカル参照を作成するための唯一のマイナー賦課だろう
thing = { stuff: { a:1, c:3, d:4 }, b:2, e:5 } 
for key, value of thing.stuff 
    thing.stuff[key] = value * 2 

doLotsOfStuff = (thing) -> 
    stuff = thing.stuff 
    stuff.a = 10 
    stuff[key] = 1.0/Math.pow(value,2) for key, value of stuff 
関連する問題