2017-02-16 27 views
5

में एक लिंक्ड सूची को पुन: प्रयोज्य बनाना मेरे पास जावास्क्रिप्ट में एक लिंक की गई सूची है जिसे मुझे for of लूप के साथ पुन: प्रयोज्य बनाने की आवश्यकता है। मैंने लगभग यह किया है लेकिन परिणाम में पहला मूल्य शामिल करने का कोई तरीका नहीं है।ईएस 6

var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}}; 

obj[Symbol.iterator] = function() { 
    var current = this; 
    return { 
    next() { 
     if (current.next !== null) { 
     current = current.next; 
     return {value: current.value, done: false}; 
     } 
     return {done: true} 
    } 
    } 
} 

for (const x of obj) { 
    console.log(x) 
} 

// this is how you get the values printed with no loop 
// console.log(obj.value + '->' + obj.next.value + '->' + obj.next.next.value) 

उत्तर

4

समस्या आप value पुन: प्राप्त करने से पहले अगले नोड के लिए current जा रहे है: यहाँ एक सरल संस्करण है।

var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}}; 
 

 
obj[Symbol.iterator] = function() { 
 
    var current = this; 
 
    return { 
 
    next() { 
 
     if (current) { 
 
     var value = current.value; 
 
     current = current.next; 
 
     return {value: value, done: false}; 
 
     } 
 
     return {done: true}; 
 
    } 
 
    }; 
 
}; 
 

 
for (const x of obj) { 
 
    console.log(x); 
 
}

यह एक generator function वाले पुनरावर्तक लागू करने के लिए बहुत आसान है।

var obj = {value: 1, next: {value: 2, next: {value: 3, next: {value: 4, next: {value: 5, next: {value: 6, next: {value:7, next: null}}}}}}}; 
 

 
obj[Symbol.iterator] = function*() { 
 
    var current = this; 
 
    while (current) { 
 
    yield current.value; 
 
    current = current.next; 
 
    } 
 
}; 
 

 
for (const x of obj) { 
 
    console.log(x); 
 
}

1

आप current के लिए परीक्षण किया जाना चाहिए, नहीं current.next:

obj[Symbol.iterator] = function() { 
    var current = this; 
    return { 
    next() { 
     if (current !== null) { 
     var res = {value: current.value, done: false}; 
     current = current.next; 
     return res; 
     } else { 
     return {done: true}; 
     } 
    } 
    }; 
} 

लेकिन यह एक जनरेटर पद्धति के रूप में बहुत सरल लिख सकते हैं:

obj[Symbol.iterator] = function*() { 
    for (var current = this; current !== null; current = current.next) { 
    yield current.value; 
    } 
} 

Btw, मैं डब्ल्यू इस इटरेटर को सूची के प्रत्येक नोड (या यहां तक ​​कि पहले भी) पर डालने की अनुशंसा नहीं करनी चाहिए। एक अलग वस्तु है कि सूची के सिर की ओर इशारा पर में डाल दिया है, या यह एक स्थिर सहायक कार्य करना:

let list = { 
    head: obj, // could be null either 
    *[Symbol.iterator]() { 
    for (var current = this.head; current !== null; current = current.next) { 
     yield current.value; 
    } 
    } 
} 

function* linkedList(head) 
    for (; head !== null; head = head.next) { 
    yield head.value; 
    } 
} 
संबंधित मुद्दे