Javascript / Coffeescript:如何优雅地在许多变量上运行一个函数(并修改它们)?

时间:2012-02-17 11:14:02

标签: javascript coffeescript

我会写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)

没有更好的办法吗?

3 个答案:

答案 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