Как определить ключ для этого массива? - PullRequest
0 голосов
/ 19 ноября 2010

Хорошо, ребята и девочки,

Я работаю с удивительным сайтом моего клиента, который полностью написан на ActionScript 3.0 со ссылками на XML.Предыдущий дизайнер установил извращающий (для меня) набор функций, который является совершенно новым для меня, но, вероятно, обычной практикой для тех, кто знаком с программированием на основе 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}
            );

элемент меню сверху имеет потомков, следовательно, он равен нулю в массиве... теперь единственный способ заставить это работать до сих пор - установить для 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... );

, но при попытке сделать это во флэш-памяти:

subnavData = new Array(1 => {"title":"OVERVIEW", "func":this.changeSlide, "param":this.showServices, "hasChild":true}, etc... );

это ничего не дает.пожалуйста помоги.спасибо!

Ответы [ 5 ]

0 голосов
/ 19 ноября 2010

, хотя синтаксис вашего исходного массива немного прикольный (условно не использовать строковые литералы для имен полей. Например, { 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 ), вы можете провести это различие.

т.е.то, что вы пытаетесь достичь, но, думаю, я понимаю, что может сбить вас с толку.Надеюсь, это поможет:)

0 голосов
/ 19 ноября 2010

Класс Object является базовым классом в AS3, в некотором смысле похожим на stdClass в PHP. Вы можете создать новый объект двумя способами.

   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";

На самом деле вам не нужно связываться с Array, но вы можете легко изменить свойство childOf, если вам неудобно значение 0. В вашем случае 0 - это целое число, поэтому при выполнении итерации по свойствам объектов должно работать следующее:

    for each( var obj:Object in subnavData )
    {
        if( obj.childOf == 0 )
          //do whatever 

    }

Но если вы, например, измените свойство childOf на "ОБЗОР", вы можете сделать это:

    for each( var obj:Object in subnavData )
    {
        if( obj.childOf == "OVERVIEW" )
         //do whatever             
    }

Практически измените свойство childOf так, как вам удобно (при условии, конечно, что оно больше нигде не используется !!!, кстати, то же самое относится и к индексации массива), хотя использование 0 в качестве целого числа должно работать здесь , Можете ли вы опубликовать пример кода, который вы используете при итерации по массиву?

0 голосов
/ 19 ноября 2010

Вы также можете загрузить массив следующим образом, пропустив 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']
0 голосов
/ 19 ноября 2010

эти фигурные скобки в массиве представляют новый объект:

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);
0 голосов
/ 19 ноября 2010

Я не совсем уверен, что вы хотите сделать здесь.

Но если вы хотите создать массив, который вы можете начать считать с 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];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...