web-dev-qa-db-fra.com

Itérer sur les éléments du décor

J'ai activé l'indicateur Chrome pour les fonctionnalités expérimentales d'ECMAscript 6, dont l'une est Set. Si je comprends bien, les auteurs de la spécification s’accordent généralement sur les détails de Set.

Je crée un ensemble a et ajoute la chaîne 'Hello'

a = Set();
a.add('Hello');

mais comment puis-je parcourir les éléments de a?

for(let i of a) { console.log(i); }

donne "SyntaxError: Illegal let déclaration en dehors du mode étendu"

for(var i of a) { console.log(i); }

donne "SyntaxError: identifiant inattendu"

for(var i in a) { console.log(i); }

donne Undefined

Est-il possible de parcourir un ensemble dans Chrome 26?

25
Randomblue

L'opérateur ofne semble pas être actuellement pris en charge dans Chrome . Il semble que seules les versions 13 à 18 de FireFox le prennent en charge. Il semble également qu'aucun des navigateurs ne supporte réellement Set bien que la page indique que certains des tests représentent l'existence et non la fonctionnalité ou la cohérence complète. Donc, il est possible que Set soit partiellement implémenté dans Chrome.

3
Vivin Paliath

J'utilise la fonction forEach(..);.

10
FranXh

Un moyen très simple consiste à transformer l’ensemble en un tableau:

let a = new Set();
a.add('Hello');
a = Array.from(a);

... et utilisez simplement une simple boucle for.

10
luschn

Sur la spécification de MDN, Set a une values ​​ méthode:

La méthode values ​​() renvoie un nouvel objet Iterator contenant les valeurs de chaque élément de l'objet Set dans l'ordre d'insertion.

Donc, pour parcourir les valeurs, je ferais:

var s = new Set(['a1', 'a2'])
for (var it = s.values(), val= null; val=it.next().value; ) {
    console.log(val);
}
9
bizi

Même si le sucre syntaxique pour l'itération n'a pas encore été implémenté, vous pouvez toujours utiliser des itérateurs.

http://www.2ality.com/2012/06/for-of-ff13.html explique

La méthode spéciale __iterator__ renvoie un objet itérateur. Un tel objet a une méthode next() qui retourne l’élément suivant de la séquence d’itération actuelle ou jette StopIteration s’il n’ya plus d’éléments.

Donc, vous devriez être capable de parcourir l'ensemble avec l'aide de

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
}

Vous pouvez également définir une version fonctionnelle de for… of like

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
Mike Samuel

La réponse de @ bizi est proche mais cela n'a pas fonctionné pour moi. Cela a fonctionné sur Firefox:

var s= new Set([1,2]),
     it = s.values();
 for (var val= it.next().value; val=it.next().value;) {
     console.log("set: "+val);
 }
0
Tech