ES6

2017-02-16 59 views
5

'da yinelenen bağlantılı bir liste oluşturma JavaScript'imde bir for of döngüsü ile yinelenebilir hale getirmem gereken bir bağlantılı listeye sahibim. Neredeyse bitirdim ama sonuçta yer alan ilk değeri elde etmenin bir yolu yok gibi görünüyor.ES6

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) 

cevap

4

sorun value almadan önce bir sonraki düğüme current taşıyoruz: İşte basitleştirilmiş bir versiyonudur.

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); 
 
}

Bir generator function ile bir yineleyici uygulamak çok daha kolaydır.

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

Sen current için test edilmelidir değil 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}; 
     } 
    } 
    }; 
} 

Ama bir jeneratör yöntemi olarak çok daha basit yazabilir: Btw

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

, Ben w Bu yinelemeyi listenin her düğümünde (ya da birincisinde) koymamaya özen gösterin. Listenin kafasına işaret eden bir ayrı nesne üzerinde koyun veya statik bir yardımcı işlevi olun:

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