Подтвердить что ты не робот

Как преобразовать цикл 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
4b9b3361

Ответ 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)