Итерация по заданным элементам
Я включил флаг Chrome для экспериментальных функций ECMAscript 6, один из которых Set
. Насколько я понимаю, детали Set
в целом согласованы спецификаторами.
Я создаю набор a
и добавляю строку 'Hello'
a = Set();
a.add('Hello');
но как я могу перебирать элементы a
?
for(let i of a) { console.log(i); }
дает "SyntaxError: Недопустимое объявление let
вне расширенного режима"
for(var i of a) { console.log(i); }
дает "SyntaxError: Неожиданный идентификатор"
for(var i in a) { console.log(i); }
дает Undefined
Возможно ли выполнить итерацию набора в Chrome 26?
Ответы
Ответ 1
Оператор of
в настоящее время не поддерживается в Chrome. Кажется, что поддерживают только версии FireFox с 13 по 18. Также кажется, что ни один из браузеров не поддерживает Set
, хотя на странице действительно говорится, что некоторые из тестов представляют собой существование, а не полную функциональность или согласованность. Таким образом, возможно, что Set
частично реализовано в Chrome.
Ответ 2
Я использую функцию forEach(..);
.
Ответ 3
Даже если синтаксический сахар для итерации еще не реализован, возможно, вы все равно можете использовать итераторы.
http://www.2ality.com/2012/06/for-of-ff13.html объясняет
Специальный метод __iterator__
возвращает объект итератора. Такой объект имеет метод next()
, который либо возвращает следующий элемент в текущей последовательности итераций, либо бросает StopIteration
, если элементов больше нет.
Итак, вы должны иметь возможность выполнять итерацию по набору с помощью
for (var it = mySet.__iterator__();;) {
var element;
try {
element = it.next();
} catch (ex) {
if (ex instanceof StopIteration) {
break;
} else {
throw ex;
}
}
// Do something with element
}
Вы также можете определить функциональную версию для & hellip; например,
function forOf(collection, f) {
// jQuery.each calling convention for f.
var applyToElement = f.bind(/* this */ collection, /* index */ void 0);
for (var it = mySet.__iterator__();;) {
var element;
try {
element = it.next();
} catch (ex) {
if (ex instanceof StopIteration) {
break;
} else {
throw ex;
}
}
// jQuery.each return convention.
if (applyToElement(element) === false) { break; }
}
}
Ответ 4
По спецификации из MDN Set
имеет метод values:
Метод values () возвращает новый объект Iterator, содержащий значения для каждого элемента в объекте Set в порядке размещения.
Итак, для итерации значений я бы сделал:
var s = new Set(['a1', 'a2'])
for (var it = s.values(), val= null; val=it.next().value; ) {
console.log(val);
}
Ответ 5
Очень простой способ - сначала включить Set в массив:
let a = Set();
a.add('Hello');
a = Array.from(a);
... и просто используйте простой цикл.
Ответ 6
@bizi answer близок, но для меня это не сработало. Это работало на Firefox:
var s= new Set([1,2]),
it = s.values();
for (var val= it.next().value; val=it.next().value;) {
console.log("set: "+val);
}