Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Вопрос про доступ к свойствам объектов, или ассоциативные массивы (http://www.flasher.ru/forum/showthread.php?t=188246)

Ленок 30.11.2012 22:45

Вопрос про доступ к свойствам объектов, или ассоциативные массивы
 
Привет!

Как облегчить такую конструкцию?

Код AS3:

        // name = 'some.where.in.galactic'
                        // stack:Object {ой блин....}
 
                        var fragments:Array = name.split('.');
                        switch (fragments.length)
                        {
                                case 1:
                                        return stack[name];
                                        break;
                                case 2:
                                        return stack[fragments[0]][fragments[1]];
                                        break;
                                case 3:
                                        return stack[fragments[0]][fragments[1]][fragments[2]];
                                        break;
                                case 4:
                                        return stack[fragments[0]][fragments[1]][fragments[2]][fragments[3]];
                                        break;
                                case 5:
                                        return stack[fragments[0]][fragments[1]][fragments[2]][fragments[3]][fragments[4]];
                                        break;
                                case 6:
                                        return stack[fragments[0]][fragments[1]][fragments[2]][fragments[3]][fragments[4]][fragments[5]];
                                        break;
                        }


GBee 30.11.2012 23:10

Nмерный массив это круто, а смысл (задача какая)?

Ленок 30.11.2012 23:22

Приходят данные произвольной структуры, надо с ними работать.

А в AS3 нет средств, позволяющих лаконично написать такой код? Надо сделать сеттер и геттер. Первый получает ключ массива произвольной глубины (land.town.tower.room...) и значение, создает указанный элемент. Второй получает ключ, и возвращает значение по нему.

Как указывать на элементы объекта?


Страшный сеттер

Код AS3:

var fragments:Array = name.split('.');
                        if (fragments.length == 1)
                        {
                                stack[name] = value;
                        }
                        if ((stack[fragments[0]] == undefined) && (fragments.length > 1))
                        {
                                stack[fragments[0]] = {};
                        }
                        if ((stack[fragments[1]] == undefined) && (fragments.length > 2))
                        {
                                stack[fragments[0]][fragments[1]] = {};
                        }
                        if ((stack[fragments[2]] == undefined) && (fragments.length > 3))
                        {
                                stack[fragments[0]][fragments[1]][fragments[2]] = {};
                        }
                        switch (fragments.length)
                        {
                                case 2:
                                        stack[fragments[0]][fragments[1]] = value;
                                        break;
                                case 3:
                                        stack[fragments[0]][fragments[1][fragments[2]] = value;
                                        break;
                                case 4:
                                        stack[fragments[0]][fragments[1][fragments[2]][fragments[3]] = value;
                                        break;
                        }

И что? Неужели это должно быть именно так ужасно?

GBee 30.11.2012 23:38

Хеш?

Код AS3:

private var _hash:Object = {};
_hash[name] = 'value';
 
...
 
return _hash[name];


Ленок 30.11.2012 23:41

Хеш. Но вот так не работает:

Код AS3:

key = 'one.two.three.four.five';
value = 'Sun';
stack[key] = value;
return stack.one.two.three.four.five; // не работает

Предполагаю, что stack['one.two.three.four.five'] это не то же, что stack.one.two.three.four.five

Коллеги, можете проверить?

GBee 30.11.2012 23:43

stack['one.two.three.four.five'] то же самое что и stack[key]

return stack['one.two.three.four.five'] только так.

Добавлено через 1 минуту
stack.one.two.three.four.five это какой-то динамический ад.

Ленок 30.11.2012 23:51

Код AS3:

stack['one.two.three.four.a'] = 'A';
stack['one.two.three.four.b'] = 'B';

one.two.three.four - существует и содержит {a:'A',b:'B'} ?

for each (letter in one.two.three.four) - будет работать?

GBee 30.11.2012 23:54

Цитата:

one.two.three.four - существует и содержит {a:'A',b:'B'} ?

for each (letter in one.two.three.four) - будет работать?
нет
нет

udaaff 30.11.2012 23:54

Не будет.

GBee 30.11.2012 23:56

если я начал понимать вашу задачу, то вам нужна рекурсия.


Часовой пояс GMT +4, время: 17:48.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.