我试图在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。
可以帮助我。
答案 0 :(得分: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);
<强> 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对象中也是一个好主意,该对象可以处理appendNode
,prependNode
,insertAfter
,insertBefore
等内容。