Фильтрация объектов AS3

В порядке. поэтому я работаю над приложением, которое извлекает элементы из базы данных и создает галерею. Я делал это много раз, и это должно быть просто.

У меня проблемы, потому что в этой галерее я получаю результаты из базы данных, которая включает как файлы изображений, так и другие файлы. Скажем так, я не могу ничего изменить, кроме вспышки, поэтому мне нужно определить, является ли это изображением, и отобразить его только в том случае, если это так.

Мой вопрос: как, черт возьми, я могу удалить свойство из объекта без того, чтобы объект оставался того же размера? Я использую функцию count() для генерации данных разбивки на страницы, поэтому я не могу просто «обнулить» их, и, насколько я понимаю, delete() тоже не вариант.

Мое решение для этого состояло в том, чтобы просто создать еще один объект, отфильтровать хорошие элементы с помощью цикла for in, а затем вставить их в другой объект, но каждый элемент в объекте является объектом, и у меня нет функции push() для объектов.

Итак, в отчаянии я использую приращение для добавления объектов к новому объекту с помощью индекса (goodItemsObject[index] = allItemsObject[object]), но это кажется действительно ужасным способом обойти эту проблему.

Вот код:

var filteredMO = new Object();
var newFile = 0;
for each(var file in mediaObject){
if(check_file(file)){
    filteredMO[newFile] = file;
    newFile++;
}
}
mediaObject = filteredMO;

check_file() просто возвращает true или false, mediaObject заполнен объектами.

Я бы предпочел сделать это:

for each(var file in mediaObject){
    if(check_file(file)){
         //remove_from_object_for_reals(mediaObject[file]);
    }
}

Я понимаю, что это может быть невозможно (выбросит ли это цикл for?), но что-то подобное было бы мило. Я бы хотел, чтобы gc мог захватить все эти бесполезные предметы, болтающиеся вокруг.

Любые идеи?

Благодарность,

Джесси


person Jesse    schedule 04.08.2009    source источник


Ответы (1)


То, что вы используете для хранения вашего объекта сейчас, называется ассоциативным массивом. Вы не можете удалить ключ-значение из ассоциативного массива. Вам нужен словарь (который as3 имеет встроенный http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/utils/Dictionary.html).

import flash.utils.Dictionary;

var dict:Dictionary = new Dictionary();

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

delete dict["myKey"]
person David    schedule 06.08.2009
comment
Спасибо, я не знал, что удаление из словарей лечится по-разному. Для объекта точно такая же команда создает индекс со значением null, отбрасывая функции count и операторы for in. - person Jesse; 08.08.2009
comment
Вы не можете удалить ключ-значение из ассоциативного массива. - Это неправда. удалить объект[ключ]; работает. - person Heitara; 17.12.2012