Javascript / Coffeescript: как элегантно запустить функцию для многих переменных (и изменить их)? - PullRequest
3 голосов
/ 17 февраля 2012

Я напишу 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 ]

4 голосов
/ 17 февраля 2012

Один из способов может быть:

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 голосов
/ 18 февраля 2012

Я думаю, я бы поступил так:

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 
0 голосов
/ 18 февраля 2012

Проблема, как сказал Рикардо Томази, в том, что вы хотите изменить несколько значений на месте. Это требует либо повторения самого себя, либо, как предлагает Лучиан, использования строк, а не идентификаторов.

Я бы порекомендовал хранить ваше состояние в более сложной структуре, чем простой объект. Если вы поместите каждое значение в свою оболочку объекта, например

@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), а не простые объекты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...