我会写Coffeescript,但生成的javacript应该很明显 我想在许多变量上运行一个函数,我想保留结果,因为它们是在其他地方读取的对象的属性。 由于Javascript似乎将它们作为值而不是引用,我只是发现了这种丑陋的方式来实现我想要的东西:
[@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()
答案 1 :(得分:0)
问题是,正如Ricardo Tomasi所说,你想要就地修改几个值。这需要重复自己,或者像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中的模型)而不是简单的对象。
答案 2 :(得分: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