好人和女孩,
我正在使用我的客户端的一个令人惊叹的网站,该网站完全使用xml引用在actionscript 3.0中编写。以前的设计师为我设置了一个对我来说完全不熟悉的功能集,但对于熟悉基于c的编程的人来说可能是正常的做法。无论如何,有一个子导航菜单,基于这个阵列防御填充...所以我面临一个问题:
subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true},
{"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0},
{"title":"SOCIAL INTERACTIVE", "func":this.changeSlide, "param":this.showOnline, "childOf":0},
{"title":"LIVE EVENTS", "func":this.changeSlide, "param":this.showLiveEvents, "childOf":0},
{"title":"CONTENT STRATEGY", "func":this.changeSlide, "param":this.showPerformance, "childOf":0},
{"title":"PROCESS", "func":this.changeSlide, "param":this.showProcess},
{"title":"CASE STUDIES", "func":this.changeSlide, "param":this.showCaseStudies},
{"title":"CLIENTS", "func":this.changeSlide, "param":this.showClients}
);
顶部的菜单项有子项,因此在数组中将它设为0 ...现在我到目前为止唯一的方法就是将“childOf”设置为'0',即字符串'0',而不是值0.我通常是一个php程序员,所以我遇到了特别的问题,即引用0点而不是从其他函数注册的固有趋势。所以,这主要是我认为这里的问题,因为'0'的字符串声明不适用于另一个函数的迭代过程,因为它期望一个数字,因为0对我不起作用,菜单赢了如果我将其设置为那样显示...参见?
所以我想知道的是我如何从1开始排序而不是0来为这个数组。当数组中的每个实例都包含在大括号({})中时,我不知道如何完成此操作。在PHP中,我会做这样的事情(假设,如果支持的值被php接受):
subnavData = array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc...
);
但在flash中尝试此操作时:
subnavData = new Array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc...
);
答案 0 :(得分:0)
我不完全确定你想在这里做什么。
但是如果你想创建一个可以从1开始计数的数组,你可以使0元素成为一个空白数组。
subnavData = new Array({}, {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );
但是如果您在访问多维数组中的元素时遇到问题,那么在AS3中执行的标准方法是:
something = subnavData[0][0];
someOtherThing = subnavData[0][1];
答案 1 :(得分:0)
您也可以像这样加载数组,跳过0:
var subnavData:Array = new Array();
subnavData[1] = {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true};
subnavData[2] = {"title":"CREATIVE DIRECTION", "func":this.changeSlide, "param":this.showBranding, "childOf":0}
subnavData[3] = etc...
顺便说一下,flash {}创建了一个对象,而不是一个数组。所以你要制作一个带有值对象的一维数组。因此,要访问该数据,它将如下所示:
subnavData[1].title;
// or you can do this
subnavData[1]['title']
答案 2 :(得分:0)
数组中的那些大括号代表一个新的对象:
subnavData = new Array({"title":"OVERVIEW", "func":this.changeSlide});
也可以这样写(虽然通常不会,因为它很冗长):
var navObject:Object = new Object();
navObject["title"] = "OVERVIEW";
navObject["func"] = this.changeSlide;
subnavData = new Array(navObject);
在没有引号的情况下编写对象键实际上更常见(尽管在某些情况下它可能很有用或者是必需的):
subnavData = new Array({title:"OVERVIEW", func:this.changeSlide});
使用点运算符或更简洁:
var navObject:Object = new Object();
navObject.title = "OVERVIEW";
navObject.func = this.changeSlide;
subnavData = new Array(navObject);
答案 3 :(得分:0)
Object类是AS3中的基类,在某些方面类似于PHP中的stdClass。您可以通过两种方式创建新对象。
var object:Object = new Object();
var object:Object = {};
您可以动态分配属性,如下所示:
object.title = "OVERVIEW";
// or this
object = {title: "OVERVIEW" , ...}; // as in your example
//you could also use the Array notation
//but it is believed to be a lot slower
object["title"] = "OVERVIEW";
你真的不需要搞乱数组,但如果你对0值不熟悉,你可以轻松更改childOf属性。在您的情况下,0是一个整数,因此当您通过Objects属性进行迭代时,以下内容应该起作用:
for each( var obj:Object in subnavData )
{
if( obj.childOf == 0 )
//do whatever
}
但是,如果您将childOf属性更改为“OVERVIEW”,则可以执行此操作:
for each( var obj:Object in subnavData )
{
if( obj.childOf == "OVERVIEW" )
//do whatever
}
实际上将childOf属性改为你喜欢的任何东西(前提是它没有在其他任何地方使用!!!顺便说一下,对于数组索引也是如此),尽管使用0作为整数应该在这里工作。您是否可以发布通过数组迭代时使用的代码示例?
答案 4 :(得分:0)
虽然你的初始数组的语法有点时髦(惯例是不使用字符串文字作为字段名称。例如{ title: 'mytitle'}
,而不是{'title': 'mytitle'}
),你确实有一个有效的对象数组
如前所述,在Actionscript中,Array
不能拥有自定义键;数组元素键只是指向数组中所需插槽的整数。 Object
是一种数据类型,可让您使用obj.myPropName
或obj.title
等自定义属性名称。
不要扭曲阵列定位,你只会混淆下一个开发人员触摸代码! :)
从你的代码片段中,我猜你的对象中的childOf
属性应该引用一个数组索引。如果是这样,我打赌你遇到了检查有效childOf
值的问题。如果您正在遍历数组,请检查每个对象是否有效childOf
属性,如下所示:
for(var i:int = 0, l:int = subnavData.length; i < l; i++ )
{
if( subnavData[i].childOf )
{
trace(i + ' is child of ' + subnavData[i].childOf)
}
}
^没有任何痕迹
然后你不会得到任何比赛。但显然你有几个childOf = 0
的条目。如果对象上不存在该值,或者将其设置为if(subnavData[i].childOf)
(0
),则布尔0 == false
检查将失败。您需要区分0
和undefined
。通过将您的检查语句更改为:if( subnavData[i].childOf != undefined )
,您可以进行区分。
IE)
for(var i:int = 0, l:int = subnavData.length; i < l; i++ )
{
if( subnavData[i].childOf != undefined )
{
trace(i + ' is child of ' + subnavData[i].childOf)
}
}
^痕迹
1 is child of 0
2 is child of 0
3 is child of 0
4 is child of 0
我正在试图解决你想要完成的事情,但我想我看到可能会绊倒你的东西。希望它有所帮助:)