Несколько условий в цикле for - PullRequest
1 голос
/ 13 декабря 2011

У меня вопрос по поводу coffeescript для цикла.

Одиночный случай достигается:

-> foo for foo in foos when foo is bar

и производит:

(function() {
  var foo, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = foos.length; _i < _len; _i++) {
    foo = foos[_i];
    if (foo === bar) _results.push(foo);
  }
  return _results;
});

что идеально.

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

->
  for foo in foos
    if foo is bar
      foo
    else if foo isnt bar
      bar

делает и компилирует в:

(function() {
  var foo, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = foos.length; _i < _len; _i++) {
    foo = foos[_i];
    if (foo === bar) {
      _results.push(foo);
    } else if (foo !== bar) {
      _results.push(bar);
    } else {
      _results.push(void 0);
    }
  }
  return _results;
});

это нормально, но мне было интересно, есть ли способ избавиться от лишних else утверждений. Прямо сейчас я добавил:

else
  return undefined

, который предотвращает нажатие на _results и работает.

Итак, есть ли в coffeescript конструкция, похожая на первый пример, но для нескольких условий?

Ответы [ 3 ]

2 голосов
/ 13 декабря 2011

Решение if...else выглядит прекрасно для меня.Помните, что when для фактического пропуска значений.Например,

num for num in [1, 2, 3, 4] when num % 2 is 0

даст вам

[2, 4]

В отличие от этого, если вы хотите, чтобы цикл возвращал список такой же длины, что и входные данные, вы должны использовать условное выражение.внутри - либо if...else, либо switch.

0 голосов
/ 15 декабря 2011

Учитывая ваши фрагменты, я бы просто использовал:

foo for foo in foos when foo is bar or foo isnt bar

но они, возможно, слишком упрощены

0 голосов
/ 13 декабря 2011

Интересно, можно ли поиграть с этим так:

-> select foo for foo in foos when foo matches bar

Требуется функция для обработки select и matches, но она даст вам синтаксис, который вы ищете:

(function() {
  var foo, _i, _len, _results;
  _results = [];
  for (_i = 0, _len = foos.length; _i < _len; _i++) {
    foo = foos[_i];
    if (foo(matches(bar))) _results.push(select(foo));
  }
  return _results;
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...