2013-05-06 22 views
18

Ich habe die Chrome-Flagge für experimentelle ECMAscript 6-Funktionen aktiviert, von denen eine Set ist. Soweit ich weiß, stimmen die Spezifikationen von Set weitgehend mit den Spezifikationen überein.Iterate über Set-Elemente

ich eine Reihe a und fügen Sie die Zeichenfolge 'Hello'

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

aber wie iterieren ich über die Elemente von a?

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

gibt "Syntax: Illegale let Erklärung außerhalb erweiterten Modus"

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

gibt "Syntaxerror: Unerwartete Kennung"

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

gibt Undefined

Ist es möglich, iterieren über ein Set in Chrome 26?

+2

[Sieht aus wie for-of] (http: // kangax.github.io/es5-compat-table/es6) wird nur in Firefox zur Zeit unterstützt ... –

+0

[Wie man ein Set in JavaScript implementiert] (http://www.javascriptexples.org/2011/01/17/how-to- implementieren-a-set-in-javascript /) – NullPointerException

+0

können Sie dies verwenden: http://jsclass.jcoglan.com/set.html –

Antwort

2

Der Operator ofdoesn't appear to be currently supported in Chrome. Es scheint, dass nur FireFox-Versionen 13 bis 18 es unterstützen. Es scheint auch, dass keiner der Browser tatsächlich Set unterstützt, obwohl die Seite sagt, dass einige der Tests Existenz und nicht volle Funktionalität oder Kohärenz darstellen. So könnte es sein, dass Set teilweise in Chrome implementiert ist.

4

Auch wenn der syntaktische Zucker für die Iteration noch nicht implementiert wurde, können Sie wahrscheinlich immer noch Iteratoren verwenden.

http://www.2ality.com/2012/06/for-of-ff13.html erklärt

The special method __iterator__ returns an iterator object. Such an object has a method next() that either returns the next element in the current iteration sequence or throws StopIteration if there are no more elements.

So sollten Sie in der Lage sein, den Satz iterieren mit

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 
} 

Sie können auch eine funktionsfähige Version von für & hellip definieren, der wie

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; } 
    } 
} 
+1

Vielen Dank. Es ist ein bisschen eklig. – Randomblue

+3

@Randomblue, Ja. Syntactic Sugar soll das alles beschönigen, aber oft implementieren verschiedene Leute die Syntaxunterstützung im Parser, als den Bibliothekscode zu implementieren, so dass Sie Releases mit der Hälfte eines Features erhalten. Wenn es die Syntax ist, die nachlässt, muss man sie einfach selbst entgucken, was es erfordert zu sehen, wie Wurst gemacht wird. –

+0

Es gibt keine solche Methode "__iterator__" im letzten Knoten v0.11.4. – Randomblue

8

Ich benutze die forEach(..); Funktion.

4

Nach der Spezifikation von MDN hat Set eine values Methode:

The values() method returns a new Iterator object that contains the values for each element in the Set object in insertion order.

die Werte also, für eine Iteration durch, ich tun würde:

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

Wenn die Iteration dann gestoppt würde? Laut den Dokumenten würde StopIteration ausgelöst werden. Eine Ausnahme zum Beenden der Iteration ist eine schreckliche Lösung. –

+0

Wenn Sie MDN Doc über Iterator beziehen, bin ich nicht sicher, ob ihr Dokument immer noch korrekt ist, sie haben auch eine Warnung auf der Seite. Der Iterator hört auf zu laufen, wenn er das Ende erreicht hat. – bizi

0

@bizi's answer der Nähe ist, aber es hat nicht funktioniert für mich. Das funktionierte auf Firefox:

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

Eine sehr einfache Art und Weise ist zunächst das Set in einem Array zu drehen:

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

... und verwenden Sie dann nur eine einfache for-Schleife.

+0

Es hat auch einen zweiten, optionalen Parameter, der eine Zuordnungsfunktion ist, um jedes Element aufzurufen, d. H.: A = Array.from (a, e => e.length). – Adamantium