Форум 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=198832)

Chum 07.05.2013 12:08

Удаление элемента ассоциативного массива.
 
Подскажите плиз.
Создан ассоциативный массив:
Код AS3:

var sprt:Sprite = new Sprite();
var assArr:Object = new Object();
assArr["sprite1"] = sprt;

Вопрос: достаточно ли будет для удаления элемента ассоциативного массива написать:
Код AS3:

assArr["sprite1"] = null;

Речь идёт об удалении элемента ассоциативного массива, а не об удалении спрайта sprt.
Если можете поправить на предмет правильности удаления элементов из асс.массива - подскажите плз.

nuToH 07.05.2013 12:36

Доброго времени суток. " = null " - неправильное решение, для удаления элемента массива есть "delete"

Код AS3:

var ht:Object = {};
var val:* = "Hello, World!";
ht["key"] = val;
for each(val in ht) trace(val);
 
delete ht["key"];
for each(val in ht) trace(val);


bav 07.05.2013 12:40

Код AS3:

var sprt:Sprite = new Sprite();
var assArr:Object = { }; // То же что и assArr:Object = new Object();
 
trace( assArr["sprite1"] ); // undefined
 
assArr["sprite1"] = sprt;
trace( assArr["sprite1"] ); // [object Sprite]
 
assArr["sprite1"] = null;
trace( assArr["sprite1"] ); // null
 
assArr["sprite1"] = sprt;
delete assArr["sprite1"];
trace( assArr["sprite1"] ); // undefined
 
var prop:String;
trace("-- 1 --");
assArr["sprite1"] = sprt;
for (prop in assArr) trace(prop); // sprite1
 
trace("-- 2 --");
assArr["sprite1"] = null;
for (prop in assArr) trace(prop); // sprite1
// Динамическое свойство 'sprite1' остается в объекта
// просто теперь оно равно null.
 
trace("-- 3 --");
assArr["sprite1"] = sprt;
delete assArr["sprite1"];
for (prop in assArr) trace(prop); // nothing
// Здесь же удаляется само свойство.

Вот описание оператора delete. Обратите внимание, что delete удаляет только динамически созданные свойства объектов (assArr["sprite1"] таковым является). В целом же, если речь идет об удалении ссылок на объекты, с целью сделать их доступными для сборщика мусора, достаточно занулить ссылку (assArr["sprite1"] = null).

Chum 07.05.2013 14:35

Спасибо, буду разбираться.

Добавлено через 13 минут
И ещё прошу уточнить, в том случае если речь идёт о многомерной структуре данных заложенной в ассоциативный массив.
Если элементом ассоциативного массива assArr является многомерный массив assArr["myarray3"] (в моём случае трёхмерный) то если написать:
Код AS3:

delete assArr["myarray3"];

то удалятся все элементы всех уровней массива assArr["myarray3"]?

Hauts 07.05.2013 14:54

Chum,а вы сами попробуйте, это же дело трех минут.

Chum 07.05.2013 15:40

Есть вещи которые разным людям даются по-разному. Есть области знаний которые требуют точной уверенности в том что результат именно такой и никакой другой и в этом случае я например, предпочитаю спросить.

КорДум 07.05.2013 15:53

Цитата:

то удалятся все элементы всех уровней массива assArr["myarray3"]?
Удалится только ссылка на массив по ключу "myarray3". Его содержимое останется в памяти, пока не придет GC и не удалит все сам, если это возможно.

Chum 07.05.2013 16:13

Тогда как я понял в моём случае необходимо взять элемент ассоциативного массива, а это трёхмерный массив (класс Array) и обнулить(=null) тройным циклом каждый элемент массива, а уж затем обнулить или удалить (delete) и сам массив, элемент ассоциативного масива, как-то так:
Код AS3:

// Удаление объектов, массив assArr["myarray3"] обычный, не ассоциативный, по-этому можно(?) обратиться к length
for(var i:int; i < assArr["myarray3"].length; i++){
 
    for(var k:int; k < assArr["myarray3"][i].length; k++){
 
        for(var c:int; c < assArr["myarray3"][i][k].length; c++){
 
            assArr["myarray3"][i][k][c] = null;
 
        }
 
        assArr["myarray3"][i][k] = null;
    }
 
    assArr["myarray3"][i];
}
 
delete assArr["myarray3"];

Добавлено через 24 минуты
Вопрос на самом деле не совсем праздный, может лучше так?
Код AS3:

                public function nullArray3(arg1:Array):void {
                        var i2, k2, c2;
                        i2 = arg1.length -1;
                        for (var i:int = i2; i >= 0; i--) {
                                k2 = arg1[i].length - 1;
                                for (var k:int = k2; k >= 0; k--) {
                                        c2 = arg[i][k].length - 1;
                                        for (var c:int = c2; c >= 0; c--) {
                                                arg1[i][k][c] = null;
                                        }
                                        arg1[i][k] = null;
                                }
                                arg1[i] = null;
                        }
                        arg1 = null;
                }

и обнулять лучше с последних элементов.

КорДум 07.05.2013 16:51

Кольцевые ссылки GC прекрасно удаляет сам. Нет необходимости бегать по каждому вложенному элементу. Достаточно отрубить только корень и дерево свалится само.

Chum 07.05.2013 16:59

Пожалуйста, поконкретнее если можно, этого достаточно:
Код AS3:

delete assArr["myarray3"];

применительно к вышесказанному мною assArr["myarray3"] это arg1 в nullArray3(arg1:Array)...


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

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