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

Итерация над ES6 Set/Map в Coffeescript (с оператором `of`)

Как можно перебирать ES6 Map или Set в Coffeescript?

В Javascript можно использовать, например,

s = new Set()
s.add({a: 1})
for (x of s) {
  console.log(x);
}

Однако Coffeescript имеет свой собственный оператор of, который преобразуется в in, то есть:

console.log(x) for x of s

становится ... for (x in s) { ... }.

Как можно получить доступ к оператору Javascript of в Coffeescript?

Можно написать собственный пользовательский итератор, переместившись на s.values().next(), но это было бы мерзостью.:)

4b9b3361

Ответ 1

В настоящее время нет возможности использовать новый оператор Javascript ES6 of из coffeescript (начиная с 1.9.2). На данный момент лучшим вариантом является использование s.forEach (x) -> ... или m.forEach (value, key) ->, как указано выше.

Для набора:

s = new Set
s.add {a: 1}

s.forEach (v) =>
  console.log v

Для отображения:

m = new Map
m.set {a: 1}, {b: 2}

m.forEach (v, k) =>
  console.log k, v

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

i = s.values()
while(v = i.next(); !v.done)
  console.log v.value

Для отображения:

i = m.entries()
while(v = i.next(); !v.done)
  [key, value] = v.value
  console.log key, value

Скобки в цикле while необходимы, чтобы цикл while зависел от v.done.

Они также могут выполняться на одной строке - но это выглядит довольно плохо:

i = s.values(); console.log v.value while(v = i.next(); !v.done)

Ответ 2

Coffeescript 2.0 - for …from

JavaScripts for... of теперь доступны как CoffeeScripts for …from (у нас уже есть for …of): for n from generatorFunction()

Coffeescript 1.0 - Backticks

Один из вариантов заключается в том, чтобы использовать обратную схему для вставки необработанного Javascript i.e http://coffeescript.org/#embedded.

`for (x of y) { }`

Ответ 3

Вы хотите сделать что-то вроде этого:

eat food for food in ['toast', 'cheese', 'wine']

(где eat - функция)

В вашем случае вы будете делать:

console.log(x) for x in s

Ссылка: http://coffeescript.org/#loops

Полезно использовать coffeescript REPL. Вы можете открыть его, набрав coffee в консоли. Попробуйте следующий код:

_ = require 'underscore' #substitute underscore for lodash, if you prefer
s = ["a", "b", "c"]
console.log(x) for x in s

Edit:

К сожалению, функция Set из ES6, похоже, пока не попала в Coffeescript. Подумайте, используя подчёркивающие методы lodash _.unique() или _.union(), чтобы имитировать функциональность, которую вы ищете.

Для примера выше:

s = _.unique ["a", "a", "b", "b", "b", "c"]
console.log(x) for x in s