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

Итерация по заданным элементам

Я включил флаг 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?

4b9b3361

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