这是代码
public function Main()
{
var node1:Object = {value: 1};
var node2:Object = {value: "foo"};
var node3:Object = {value: "bar"};
var node4:Object = {value: "test"};
for (var a:int = 1; a < 4 ; a++)
{
if (a < 3)
{
node[a].next = node[a + 1];
}
else
{
node[a].next = null;
}
}
// ((node1.next = node2).next = node3).next = null; works, but
// not the code above
var n:Object = node1;
while (n)
{
trace(n.value);
var jsonString:String = JSON.stringify(n);
trace(jsonString);
n = n.next;
}
}
我能解释一下吗?
我知道对象不是数组,但应该可以将指针放在正确的位置。我很确定,这可能是一个动态的解决方案。我真的尝试了不同的符号。你有提示吗?
答案 0 :(得分:1)
实际问题是您为节点列表创建变量。然后,您尝试使用这些名称来访问对象。相反,只需在类似的数组中创建它们(代码未经过测试)
public function Main()
{
var nodes:Array = [{value: 1}, {value: "foo"}, {value: "bar"}, {value: "test"}];
for each(var a:int = 0; a < nodes.length - 1 ; a++)
{
nodes[a].next = nodes[a + 1];
}
var n:Object = nodes[0];
while (n)
{
trace(n.value);
var jsonString:String = JSON.stringify(n);
trace(jsonString);
n = n.next;
}
}
由于多种原因,您当前的解决方案很糟糕。它不是很灵活。如果要将一个节点添加到列表中,则必须创建一个具有适当名称的新变量(否则它将不会被循环拾取)您还必须修改循环中的硬编码上限。在代码中冗余地使用相同的信息是维护的噩梦。
这是另一个:如果你想删除node2
怎么办?是的,您必须重命名以下所有变量。
您使用循环获得动态解决方案的想法很好。然而,创建数据的方式是这个目标的障碍。 尽量避免在程序中使用变量名作为值。
答案 1 :(得分:0)
for (var a:int = 1; a < 4 ; a++)
{
if (a < 3)
{
this["node"+ String(a)].next = this["node"+ String(a+1)];
}
else
{
this["node"+ String(a)].next = null;
}
}
我使用括号语法动态访问属性(按字符串)。您可以通过在互联网上搜索来了解更多信息。