2016-12-16 4 views
7

यह मेरे लिए ठीक काम करता है:दोहराएं

const iterable = [1, 2, 3]; 

for (const value of iterable) { 
    console.log(value); 
} 

हालांकि यह काम नहीं करता:

const iterable = {1:10, 2:20, 3:30}; 

for (const value of iterable) { 
    console.log(value); 
    console.log(iterable[value]); 
} 

इसके बजाय मुझे त्रुटि दे रही है:

Uncaught TypeError: iterable[Symbol.iterator] is not a function(…) 

कैसे करना चाहिए मैं यह कर रहा हूँ?

for(const value in iterable){ 
    if (iterable.hasOwnProperty(value)) { 
     console.log(value); 
     console.log(iterable[value]); 
    } 
} 
+3

क्या आपका मतलब 'इन ... में' था? और नहीं, पहला उदाहरण "काम" नहीं करना चाहिए। – Bergi

+0

आपको यह नहीं करना चाहिए। बस 'इन ... लूप' के लिए उपयोग करें। आपको '.hasOwnProperty' चेक, बीटीडब्ल्यू की आवश्यकता नहीं है। – Bergi

उत्तर

8

for..of केवल iterable objects के लिए काम करता है:

यह अब मुझे क्या करना है। आप इस तरह की एक इटरेटर को लागू कर सकते हैं:

const iterable = { 
    [Symbol.iterator]() { 
    return { 
     i: 1, 
     next() { 
     if (this.i <= 3) { 
      return { value: 10 * this.i++, done: false }; 
     } 
     return { value: undefined, done: true }; 
     } 
    }; 
    } 
}; 

for (const value of iterable2) { 
    console.log(value); 
} // 10, 20, 30 

सादा वस्तुओं से अधिक पुनरावृति करने के लिए, for...in जो मुझे लगता है कि ठीक है के अलावा अन्य, आप Object.keys इस्तेमाल कर सकते हैं:

const iterable = {1:10, 2:20, 3:30}; 
Object.keys(iterable).forEach(key => { 
    console.log(iterable[key]); 
}); // 10, 20, 30 

BTW अपना पहला उदाहरण में सिंटेक्स त्रुटि फेंकता , शायद आप const iterable = [1,2,3] मतलब था? तब यह काम करेगा क्योंकि Arrays अस्थिर वस्तुओं हैं।

+5

मुझे लगता है कि शीर्ष कोड 5x कम पठनीय –

+0

या कोड डरावना है – vijay

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