2016-07-25 10 views
0

オブジェクトを実装するファクトリ関数の方法を使用しようとしていて、リンクリストの例でそれを試しました。空のリンクリストを初期化してノードを追加しようとしました。それが設定されていない場合は頭を設定し、そうでない場合はチェーン内の最後のノードにノードを追加します。 問題は、頭が決して固まっていないように見えるということです。ここでファクトリ関数のリンクリストの問題

"use strict" 

const niceLog = s => { 
    console.log(JSON.stringify(s, null, 2)) 
} 

function linkedList() { 
    let head 

    const node = data => { 
    return { 
     data, 
     next: null 
    } 
    } 

    const add = data => { 
    if (!head) { 
     head = node(data) 
    } else { 
     const end = node(data) 
     let n = head 
     while (n.next) n = n.next 
     n.next = end 
    } 
    } 

    const del = data => { 
    let n = head 

    if (n.data === data) head = head.next 

    while (n.next) { 
     if (n.next.data === data) { 
     n.next = n.next.next 
     return 
     } 
     n = n.next 
    } 
    } 


    return { 
    head, 
    add, 
    del 
    } 
} 


const ll = linkedList() 

ll.add('cheese') 
ll.add('crackers') 
ll.add('tea') 
ll.add('coffee') 

niceLog(ll) // {} 

(私は、彼らが新しい、これは私がしようとしていたThatsなぜよう適切に設定されていないキーワードの問題を避けるよう、工場の機能が優れていることを聞いていた、仕事をするES6クラスの構文で同等のコードです工場機能を使用する)

const niceLog = s => { 
    console.log(JSON.stringify(s, null, 2)) 
} 

class Node { 
    constructor(data) { 
    this.data = data 
    this.next = null 
    } 
} 

class LinkedList { 
    constructor() { 
    this.head = null 
    } 

    add(data){ 
    if (!this.head) { 
     this.head = new Node(data) 
    } else { 
     const end = new Node(data) 
     let n = this.head 
     while (n.next) n = n.next 
     n.next = end 
    } 
    } 

    del(data) { 
    let n = this.head 

    if (n.data === data) this.head = this.head.next 

    while (n.next) { 
     if (n.next.data === data) { 
     n.next = n.next.next 
     return 
     } 
     n = n.next 
    } 
    } 
} 


const ll = new LinkedList() 

ll.add('cheese') 
ll.add('crackers') 
ll.add('tea') 
ll.add('coffee') 

niceLog(ll) // output = 


"head": { 
    "data": "cheese", 
    "next": { 
     "data": "crackers", 
     "next": { 
     "data": "tea", 
     "next": { 
      "data": "coffee", 
      "next": null 
     } 
     } 
    } 
    } 
} 
+2

あなたの質問は何ですか? –

+0

今質問部分を追加しました! – Heisenberg

答えて

2

これはコメントには長すぎます。 JavaScriptでは「ファクトリ関数」が何であるか混乱しているようです。ファクトリファンクションはではありません。では、thisキーワードを使用しないようにしています。

let myFactoryPrototype = { 
    someMethod: function() { 
    return this.foo; 
    } 
}; 

let myFactory =() => Object.create(myFactoryPrototype); 
let myObject = myFactory(); // no 'new' 

は、定期的かつ矢印関数構文のミックスに注意してください。それはあなたがnewキーワードを避けることを意味しません。私はthisが問題ではない矢印機能を使用していましたが、通常の古いfunctionがあります。

const addToLinkedList = (list, node) => { 
    // code return a new list with the extra node goes here 
}; 

しかし、実際に、thisを回避することは、あなたが本当にに対して切断している、JavaScriptで難しいです:あなたは、メソッドを使用していない、その後thisを避けたい場合は、データ型で動作する通常の(おそらく純粋な)関数を使用します粒。一方、newを避けることは非常に簡単です。ただObject.createまたはオブジェクトリテラルを使用してください。

関連する問題