117 votes

Itérer sur les éléments d'un ensemble

J'ai activé le drapeau Chrome pour les fonctionnalités expérimentales d'ECMAscript 6, dont l'une est Set . Si j'ai bien compris, les détails de la Set sont largement approuvées par les rédacteurs de spécifications.

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

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

mais comment itérer sur les éléments de a ?

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

donne "SyntaxError : Illegal let déclaration hors 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 d'itérer sur un ensemble dans Chrome 26 ?

8voto

jpthesolver2 Points 839

Une approche fonctionnelle simple consiste à utiliser forEach

const mySet = new Set([1, 2, 3])
mySet.forEach(a => { console.log(a) })
// 1 2 3

7voto

Sean Watters Points 81

Vous pouvez également utiliser l'opérateur d'étalement pour convertir une valeur de Set dans un tableau (une alternative à Array.from(yourSet) ).

const mySet = new Set();

mySet.add('a');
mySet.add('b')

const iterableSet = [...mySet];
// end up with: ['a', 'b']

// use any Array method on `iterableSet`
const lettersPlusSomething = iterableSet.map(letter => letter + ' something');

5voto

Mike Samuel Points 54712

Même si le sucre syntaxique pour l'itération n'a pas encore été implémenté, vous pouvez probablement encore 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 possède une méthode next() qui renvoie l'élément suivant dans la séquence d'itération actuelle ou qui jette StopIteration s'il n'y a plus d'éléments.

Vous devriez donc être en mesure d'itérer sur l'ensemble à 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 comme

function forOf(collection, f) {
  // jQuery.each calling convention for f.
  var applyToElement = f.bind(/* this */ collection, /* index */ void 0);
  for (var it = collection.__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; }
  }
}

2voto

nik.ss Points 41

Cela a fonctionné pour moi

mySet.forEach(async(item) =>{
   await doSomething(item)
 })

0voto

Vasanth Points 152
let set = new Set();
set.add(1);
set.add(2);

// This will be an array now, now you can loop normally.
console.log([...set]);

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X