0

jqueryでリストオブジェクトを作成しようとしています。次のコードを使用していますが、機能していません。このを見つけたので、同様のことを書きました。

function Node(left, right, content)
{
    this.left = left;
    this.right = right;
    this.content = content;
}

var n1 = new Node('', n2, 'content content content');    
var n2 = new Node(n1, n2, 'content content content');
var n3 = new Node(n2, '', 'content content content');

console.log(box2);

今、私がそれを呼び出すn1.rightと、未定義を返します。私を助けてください。

4

7 に答える 7

2

left他のノードを使用してリンクする代わりにright、リストのコンテナーとして機能する別のノードにすべてのノードを含めます。

外側のノードから要素にアクセスできます。

例えば:

function Node(content) {
  this.nodes = [];
  this.content = content;
  this.addNode = function(node) {
    this.nodes.push(node);
  };
  this.changeContent = function(newContent) {
    this.content = newContent;
  };
}

var container = new Node();
container.addNode(new Node("Node 1"));
container.addNode(new Node("Node 2"));
container.addNode(new Node("Node 3"));

console.log(container);

Codepenで見られるように

于 2013-01-23T13:52:18.767 に答える
1

値を持つ前に に渡しn2ているため、です。ノードが存在する前に、ノードを別のノードに渡すことはできません。new Nodeundefined

簡単な修正は、作成後にノードを「リンク」することです。

function Node(content, left, right)
{
    this.left = left;
    this.right = right;
    this.content = content;
}

var n1 = new Node('content content content');    
var n2 = new Node('content content content');
var n3 = new Node('content content content');

n1.right = n2;
n2.left = n1;
n2.right = n3;
n3.left = n2;

おそらく、リストへの新しいノードの挿入を適切に処理するために、いくつかの getter メソッドと setter メソッドが必要になるでしょう。

オブジェクトの仕組みについて詳しくは、MDN - Woking with objects をご覧ください。


ただし、これは XY 問題である可能性があります。その場合、実際に解決しようとしている問題を説明する必要があります。オブジェクトのリストを作成したいだけなら、配列[MDN]を使用できます。

于 2013-01-23T13:57:26.423 に答える
0

あなたのコードを見てください:

var n1 = new Node('', n2, 'content content content');    
var n2 = new Node(n1, n2, 'content content content');
var n3 = new Node(n2, '', 'content content content');

作成するときはオブジェクトn1がないn2ので、を挿入しundefinedます。

于 2013-01-23T13:54:18.933 に答える
0

まず、ここでいくつかの有用なコードを省略しました。たとえば、box2オブジェクトは何ですか。

とにかく、n2をn1に追加しようとしましたが、まだ存在していません。

var n1 = new Node('', n2, 'content content content'); // n2 does not yet exist   
var n2 = new Node(n1, n2, 'content content content'); // n2 can't reference itself yet
var n3 = new Node(n2, '', 'content content content');

最初にルートノードを作成するか、ノードが作成されたらノードへの接続を追加できる、より洗練されたオブジェクトパターンを作成する必要があります。

于 2013-01-23T13:54:31.843 に答える
0
function Node(left, right, content)
{
    this.left = left;
    this.right = right;
    this.content = content;
}

var n1 = new Node('', null, 'content content content');    
var n2 = new Node(n1, n2, 'content content content');

n1.right=n2;

var n3 = new Node(n2, '', 'content content content');

console.log(n1.right);
于 2013-01-23T13:56:43.507 に答える
0

Node コンストラクターに左右のノードを更新させることができます。したがって、現在のノードが左に n2 を持っている場合、n2 は現在のノードを右に持つ必要があります。

function Node(left, right, content)
{
    this.left = left;  
    this.right = right;
    this.content = content;
    if(left) {
       left.right = this;
    }
    if(right) {
       right.left = this;
    }
}

var n1 = new Node(null, null, 'content content content');    
var n2 = new Node(n1, null, 'content content content');
var n3 = new Node(n2, null, 'content content content');

console.log(n1.right.content);
于 2013-01-23T14:00:24.037 に答える
0

他の人が言ったように、作成されるまで値を割り当てることはできません。遅延読み込みを行うこともできますが、それはあなたにとって複雑になるように思えます。これを試して:

function Node(content, prev, next) {
    var setPrev = function(node){
        var oldPrev = this.prev;
        this.prev = node;
        node.next = this;
        node.prev = oldPrev;
    }
    ,setNext = function(node){
        var oldNext = this.next;
        this.next = node;
        node.next = oldNext;
        node.prev = this;
    }
    return {
        'content': content,
        'prev': prev,
        'next': next,
        'setPrev': setPrev,
        'setNext': setNext
    }
}
n1 = new Node('content content content');    
n2 = new Node('content content content', n1);
n3 = new Node('content content content', n2);
n1.setNext(n2);
n2.setNext(n3);

appendNodeこれを、prependNodeinsertAfterinsertBefore、 などを処理できるある種の List オブジェクトにカプセル化することも良い考えです。

于 2013-01-23T14:03:28.913 に答える