2013-05-06 11 views
18

मैंने प्रायोगिक ECMAscript 6 सुविधाओं के लिए क्रोम ध्वज चालू कर दिया है, जिनमें से एक Set है। जैसा कि मैं समझता हूं, Set का ब्योरा व्यापक रूप से spec लेखकों द्वारा सहमत है।सेट तत्वों पर Iterate

मैं एक सेट a बना सकते हैं और स्ट्रिंग 'Hello'

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

जोड़ते हैं, लेकिन मैं कैसे a के तत्वों से अधिक पुनरावृति करते हैं?

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

देता है "सिंटैक्स त्रुटि: अनपेक्षित पहचानकर्ता"

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

देता Undefined

यह पुनरावृति करना संभव है:

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

देता है "अवैध let घोषणा के बाहर बढ़ाया मोड सिंटैक्स त्रुटि" क्रोम 26 में एक सेट के ऊपर?

+2

[जैसा दिखता है] (http: //kangax.github।io/es5-compat-table/es6) केवल वर्तमान में फ़ायरफ़ॉक्स में समर्थित है ... –

+0

[जावास्क्रिप्ट में एक सेट को कैसे कार्यान्वित करें] (http://www.javascriptexamples.org/2011/01/17/how-to- कार्यान्वयन-ए-सेट-इन-जावास्क्रिप्ट /) – NullPointerException

+0

क्या आप इसका उपयोग कर सकते हैं: http://jsclass.jcoglan.com/set.html –

उत्तर

2

of ऑपरेटर doesn't appear to be currently supported in Chrome। ऐसा लगता है कि केवल 13 से 18 फ़ायरफ़ॉक्स संस्करण इसका समर्थन करते हैं। यह भी प्रतीत होता है कि कोई भी ब्राउज़र वास्तव में Set का समर्थन नहीं करता है हालांकि पृष्ठ कहता है कि कुछ परीक्षण अस्तित्व का प्रतिनिधित्व करते हैं और पूर्ण कार्यक्षमता या समन्वय नहीं करते हैं। तो हो सकता है कि Set आंशिक रूप से क्रोम में कार्यान्वित किया गया हो।

4

भले ही पुनरावृत्ति के लिए सिंटैक्टिक चीनी अभी तक लागू नहीं की गई है, फिर भी आप अभी भी इटरेटर का उपयोग कर सकते हैं।

http://www.2ality.com/2012/06/for-of-ff13.html बताते

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.

तो तुम

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

धन्यवाद। हालांकि, यह थोड़ा भाग्यशाली है। – Randomblue

+3

@Randomblue, हाँ। सिंटैक्टिक चीनी का मतलब उन सभी पर चमक है, लेकिन अक्सर अलग-अलग लोग लाइब्रेरी कोड को लागू करने के बजाय पार्सर में सिंटैक्स समर्थन को लागू करते हैं ताकि आपको एक फीचर के आधे से रिलीज़ हो। जब यह सिंटैक्स होता है जो आपको लापता करता है तो उसे खुद को अव्यवस्थित करना पड़ता है जिसके लिए यह देखने की आवश्यकता होती है कि सॉसेज कैसे बनाया जाता है। –

+0

नवीनतम नोड v0.11.4 में ऐसी कोई '__iterator__' विधि नहीं है। – Randomblue

8

मैं forEach(..); फ़ंक्शन का उपयोग करता हूं।

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

तो, मूल्यों के माध्यम से पुनरावृति के लिए, मैं क्या करना होगा:

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

MDN से कल्पना करने पर, Set एक values विधि है मेरे लिए। यह फ़ायरफ़ॉक्स पर काम किया:

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

तब पुनरावृत्ति को रोका जाएगा? दस्तावेज़ों के मुताबिक, स्टॉपइटरेशन फेंक दिया जाएगा। पुनरावृत्ति को रोकने के लिए अपवाद का उपयोग करना एक भयानक समाधान है। –

+0

यदि आप इटरेटर के बारे में एमडीएन दस्तावेज़ का जिक्र कर रहे हैं, तो मुझे यकीन नहीं है कि उनका दस्तावेज़ अभी भी सटीक है या नहीं, उनके पास पृष्ठ पर चेतावनी भी है। एक बार यह अंत तक पहुंचने के बाद पुनरावर्तक आगे बढ़ना बंद कर देगा। – bizi

4

एक बहुत ही आसान तरीका एक सरणी में सेट चालू करने के लिए पहले है:

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

... और फिर बस पाश के लिए एक सरल का उपयोग करें।

+0

इसके अलावा, इसमें एक दूसरा, वैकल्पिक पैरामीटर है जो प्रत्येक तत्व पर कॉल करने के लिए मैपिंग फ़ंक्शन है, यानी: 'a = Array.from (a, e => e.length) '। – Adamantium

संबंधित मुद्दे