2012-02-17 45 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

只有對象作爲引用傳遞,而不是值。 – 2012-02-17 20:11:02

回答

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 2012-02-20 02:57:06

0

的問題是,李嘉圖托馬西說,那你要在原地修改幾個值。這就需要重複自己,或者像Lucian所說的那樣,使用字符串而不是標識符。

我推薦的是將你的狀態存儲在比一個簡單對象更復雜的結構中。如果你把每個值放在它自己的對象包裝中,例如

@au = {val: 5} 

那麼你可以簡單的寫

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

你可能會在未來決定存儲在這些對象的附加狀態。舉例來說,如果你想看到什麼樣的隨機值是在未來,你可以改變迭代

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

您可能還需要考慮使用事件觸發模型(像那些在Backbone.js的),而不是簡單的物體。

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 
相關問題