在JQuery中创建一个列表

时间:2013-01-23 13:47:34

标签: javascript oop

我试图在jquery中创建一个列表对象,我使用下面的代码但它没有工作,我发现这个example所以我写了类似的东西。

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。 可以帮助我。

7 个答案:

答案 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

答案 1 :(得分:1)

您在n2之前将new 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; 。在存在之前,您无法将节点传递给另一个节点。

一个简单的解决方法是在创建节点后“链接”节点:

{{1}}

虽然你可能想要一些getter和setter方法来正确处理新节点插入列表。

详细了解对象的工作原理:MDN - Woking with objects


这可能是一个XY问题,在这种情况下,您必须解释您实际尝试解决的问题。如果您只想创建对象列表,可以使用array [MDN]

答案 2 :(得分: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

答案 3 :(得分: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');

您应首先创建根节点或创建更复杂的对象模式,您可以在创建节点后将其添加到节点。

答案 4 :(得分: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);

答案 5 :(得分: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);

答案 6 :(得分: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对象中也是一个好主意,该对象可以处理appendNodeprependNodeinsertAfterinsertBefore等内容。