2013-01-23 83 views
0

我想在jQuery中創建一個List對象,我使用下面的代碼,但它不工作,我發現這個example所以我寫了一個類似的東西。現在在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它返回undefined。 可以幫助我。

+1

我刪除了[標籤:jQuery的]標籤,因爲這實際上與jQuery無關。 –

+0

@AndrewWhitaker我在JQuery中發現了一些解決方案,但它不工作也檢查此:http://stackoverflow.com/questions/4595312/jquery-creating-entire-dom-structures –

+6

那麼,你正在傳遞'n2'到'新節點「,然後它有一個值,因此它是'未定義的'。在節點存在之前,您無法將該節點傳遞給另一個節點。 –

回答

1

你傳入n2new Node它有一個值之前,因此這是undefined。在節點存在之前,您無法將該節點傳遞給另一個節點。

一個簡單的解決將是您創建後他們「鏈接」的節點:

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問題,在這種情況下,您必須解釋您實際嘗試解決什麼問題。如果您只想創建一個對象列表,您可以使用array [MDN]

+0

這對我來說很好,謝謝:) –

2

不是使用leftright鏈接到其他節點,而是將所有節點包含在另一個節點中,它們將充當列表的容器。

您可以從外部節點訪問元素。

例如:

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

As seen on Codepen

+0

可以給我看一些代碼請 –

+1

@ T.Baba:增加。 –

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

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

,必須先創建一個根節點或創建一個更復雜的對象模式,您可以添加在連接節點一次他們已經創建。

+0

如何解決? –

+0

菲利克斯已經給你解決方案。這是非常基本的東西,所以我不打算爲你做這一切:http://stackoverflow.com/a/14481491/775007 – Dean

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

您可以使節點構造函數更新左/右節點。所以,如果左,比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); 
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); 

這也是一個偉大的想法,封裝成某種List對象,可以處理像appendNode東西,prependNodeinsertAfterinsertBefore這等