Итерация над 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()
, но это было бы мерзостью.:)
Ответы
Ответ 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
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