我如何定义此数组的键?

时间:2010-11-18 23:45:16

标签: php flash actionscript-3

好人和女孩,

我正在使用我的客户端的一个令人惊叹的网站,该网站完全使用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... );

它没有产生任何结果。请帮忙。谢谢!

5 个答案:

答案 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.myPropNameobj.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检查将失败。您需要区分0undefined。通过将您的检查语句更改为: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

我正在试图解决你想要完成的事情,但我想我看到可能会绊倒你的东西。希望它有所帮助:)