Как преобразовать цикл JavaScript forEach в функцию CoffeeScript
Фон. Я пытаюсь преобразовать код JavaScript, который использует библиотеку Crossfilter с D3.js в CoffeeScript.
Каков наилучший способ преобразования JavaScript forEach loop/function в CoffeeScript?
Вот код JavaScript:
// A little coercion, since the CSV is untyped.
flights.forEach(function(d, i) {
d.index = i;
d.date = parseDate(d.date);
d.delay = +d.delay;
d.distance = +d.distance;
});
Может ли CoffeeScript выполнять встроенную функцию внутри цикла? Прямо сейчас, я думаю, мне нужно, чтобы он разбился на функцию и цикл:
coerce = (d) ->
d.index = 1
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
coerce(flights) for d in flights
Ответы
Ответ 1
используйте понимание
for d, i in flights
console.log d, i
Приведенный выше код переводится на
var d, i, _i, _len;
for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) {
d = flights[i];
console.log(d, i);
}
чтобы вы могли видеть d
и i
- это то, что вы хотите.
Перейдите сюда и найдите "forEach" для некоторых примеров.
Наконец, посмотрите на первый комментарий для более полезной информации.
Ответ 2
Прямой перевод:
flights.forEach (d, i) ->
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
или вы можете использовать идиоматическую версию:
for d,i in flights
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
Ответ 3
forEach имеет преимущество обертывания каждой итерации в закрытии. поэтому асинхронные вызовы могут сохранять правильные значения.
способ coffeescript сделать это (без фактического использования forEach)
for d,i in flights
do (d, i)->
d.index = i
d.date = parseDate(d.date)
d.delay = +d.delay
d.distance = +d.distance
это компилируется в нечто очень похожее на образец OP:
_fn = function(d, i) {
d.index = i;
d.date = parseDate(d.date);
d.delay = +d.delay;
return d.distance = +d.distance;
};
for (i = _i = 0, _len = flights.length; _i < _len; i = ++_i) {
d = flights[i];
_fn(d, i);
}
Используйте это, если вам нужно < ie9 (forEach поддерживается в IE начиная с версии 9)