2013-03-05 2 views
2

Я следующий CoffeeScript код:Как использовать переменные в списках?

result = ([number, process = number * 2, process] for number in [1, 2, 3]) 

Который компилируется в:

var number, process, result; 

result = (function() { 
    var _i, _len, _ref, _results; 
    _ref = [1, 2, 3]; 
    _results = []; 
    for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
    number = _ref[_i]; 
    _results.push([number, process = number * 2, process]); 
    } 
    return _results; 
})(); 

Результат представляет собой многомерный массив:

[ [1, 2, 2], [2, 4, 4], [3, 6, 6] ] 

Давайте предположим, что process рассчитывается очень дорого и я хочу использовать это значение в качестве аргумента для нескольких различных функций:

result = ([number, process = /* costly calculation */, function1(process), function2(process), function3(process)] for number in [1, 2, 3]) 

Это работает на самом деле отлично. Однако я не хочу, чтобы значение process было элементом результирующего массива. Его значение теперь остается вторым элементом массива. Когда я смотрю на скомпилированный Javascript я могу легко перемещать определение process из массива вроде этого:

for (_i = 0, _len = _ref.length; _i < _len; _i++) { 
    number = _ref[_i]; 
    process = number * 2; 
    _results.push([number, process]); 
} 

Как я могу сделать это в CoffeeScript?

Попробуйте online!

ответ

1

ли этот, и это должно решить проблему:

result = ([number = (process = /* costly calculation */) - process + number, function1(process), function2(process), function3(process)] for number in [1, 2, 3]) 

Здесь две дополнительные операции (сложение и вычитание) будет сделано для каждого числа в массиве. Но он не должен слишком сильно увеличивать затраты на калькуляцию.

Его можно оптимизировать, чтобы снизить стоимость расчета.

Обновление:

Используйте этот один, когда вам не нужны переменные number, process:

result = ([function1(process = /* costly calculation */), function2(process), function3(process)] for number in [1, 2, 3]) 
+0

Спасибо за ответ, но это выглядит грязно. Что делать, если я даже не хочу 'number' в моем массиве? – Amberlamps

+0

@Amberlamps проверить обновленный ответ. – stackoverflowery

+0

Это на самом деле хороший обходной путь. Благодаря! – Amberlamps

1

В CoffeeScript блоков выражения, так что вы можете сделать:

result = (process = costlyCalculation(); [number, function1(process), function2(process), function3(process)] for number in [1, 2, 3]) 

Или, вместо использования точек с запятой для отдельных операторов, я бы рекомендовал использовать строки новой строки:

result = for number in [1, 2, 3] 
    process = costlyCalculation() 
    [number, function1(process), function2(process), function3(process)] 
+0

Благодарим вас за ввод. Я не знал этого. – Amberlamps

Смежные вопросы