Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > ActionScript 3.0

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 15.02.2011, 22:17
QuanChi вне форума Посмотреть профиль Отправить личное сообщение для QuanChi Найти все сообщения от QuanChi
  № 1  
Ответить с цитированием
QuanChi

Регистрация: Sep 2009
Сообщений: 8
Question Парадокс! при удалении свойств в цикле for in

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

Делам следующее:
Код AS3:
for (var  k in a) { 
  trace('a[' + k + ']=' + a[k]);
  delete(a[k]);
}
Если ключи массива идут подляд 012345678... то все прекрасно удаляется, но
в случае если (как показали эксперименты):
1. числовые ключи в массиве с пропусками
2. в массиве присутствует значение с ключом 0 ноль
3. при определенном количестве элементов в массиве

for in при пробегании свойств массива и удалении, игнорирует ключи кратные 8... 8 16 32 итд
и не удаляет их.

пример ...
Код:
------- массив ---------------------
var a:Array = new Array();
a[0]='a0';
a[8]='a8';
a[9]='a9';
a[10]='a10';
a[11]='a11';
a[12]='a12';
a[13]='a13';
------------trace порядок удаления----------------
a[0]=a0
a[9]=a9
a[10]=a10
a[11]=a11
a[12]=a12
a[13]=a13
------- не удалилось ---------------------
a[8]=a8
Еще пример
Код:
-------  массив  ---------------------
a[0]='a0'
a[1]='a1'
a[16]='a16'
a[17]='a16'
a[8]='a8'
a[9]='a9'
a[10]='a10'
a[11]='a11'
a[12]='a12'
a[13]='a13'
a[14]='a14'
a[15]='a15'
------------trace порядок удаления----------------
a[0]=a0
a[17]=a16
a[1]=a1
a[8]=a8
a[9]=a9
a[10]=a10
a[11]=a11
a[12]=a12
a[13]=a13
a[14]=a14
a[15]=a15
------- не удалилось ---------------------
a[16]=a16
Возможно for in пробегает по свойствам перебирая их пачкими по 8 штук.. и если в процессе цикла мы удаляем свойства в предыдущей пачке зависает одно значение.. как-то... О_о


Последний раз редактировалось QuanChi; 15.02.2011 в 22:21.
Старый 15.02.2011, 22:50
nOobCrafter вне форума Посмотреть профиль Отправить личное сообщение для nOobCrafter Найти все сообщения от nOobCrafter
  № 2  
Ответить с цитированием
nOobCrafter

Регистрация: Nov 2008
Сообщений: 894
Записей в блоге: 1
а обычным массивом все корректно удаляется? массив не уменьшает размер?

Старый 15.02.2011, 23:09
QuanChi вне форума Посмотреть профиль Отправить личное сообщение для QuanChi Найти все сообщения от QuanChi
  № 3  
Ответить с цитированием
QuanChi

Регистрация: Sep 2009
Сообщений: 8
ну тут опираться на размер вообще не было возможности... размер массива выставляется по максимальному ключу.. а реального количества значений не показывает и конечно не изменяется при удалении элементов.

ну обычным циклом самому перебирать ключи можно, наматывая лишние циклы на несуществующих ключах. Но ключи могут идти не подряд и вообще отсутствовать.

Старый 15.02.2011, 23:17
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 4  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Да, забавно. Перебирает все, а удаляет не все.
Присваивайте null каждому элементу, или просто новый экземпляр Array создавайте.

Старый 15.02.2011, 23:51
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 5  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
В связи с повторением темы
http://www.flasher.ru/forum/showthread.php?t=149318
хочу снова спросить:
"НЕ на массиве, а на объекте удалось добиться такой лажи?"

Старый 16.02.2011, 00:31
QuanChi вне форума Посмотреть профиль Отправить личное сообщение для QuanChi Найти все сообщения от QuanChi
  № 6  
Ответить с цитированием
QuanChi

Регистрация: Sep 2009
Сообщений: 8
Прошу прощения за повторение, по поиску не нашел... с Объектом подобных казусов очевидно не происходит. Видимо бага где-то в глубине методов объекта Array.

Старый 16.02.2011, 00:36
Bgg вне форума Посмотреть профиль Отправить личное сообщение для Bgg Найти все сообщения от Bgg
  № 7  
Ответить с цитированием
Bgg
 
Аватар для Bgg

Регистрация: Jan 2009
Адрес: Петерсбург
Сообщений: 1,882
Цитата:
А это не баг, это неверное использование for in. При удалении ключей происходит смещение индексов и появляются пропуски ключей.
Ждем etc.

Старый 16.02.2011, 00:55
samana вне форума Посмотреть профиль Отправить личное сообщение для samana Найти все сообщения от samana
  № 8  
Ответить с цитированием
samana
 
Аватар для samana

блогер
Регистрация: Mar 2008
Адрес: Днепропетровск
Сообщений: 1,783
Записей в блоге: 3
Да, странно получается.... Наверно для таких целей лучше использовать просто цикл for, а не for in.

Старый 16.02.2011, 01:32
gloomyBrain вне форума Посмотреть профиль Отправить личное сообщение для gloomyBrain Найти все сообщения от gloomyBrain
  № 9  
Ответить с цитированием
gloomyBrain
 
Аватар для gloomyBrain

блогер
Регистрация: Mar 2008
Адрес: РФ, Санкт-Петербург
Сообщений: 2,272
Записей в блоге: 5
Отправить сообщение для gloomyBrain с помощью ICQ Отправить сообщение для gloomyBrain с помощью Skype™
Вот еще интересная штука
Код AS3:
var o:Object = { b: "1", c: "2" }
for (var name:String in o) {
	o["a"] = "3";
	trace(name, o[name]); // b 1, c 2
}
trace(o["a"]); // 3
То есть свойство a появляется только по выходе из цикла? Нет, не может быть! Проверим
Код AS3:
var o:Object = { a: "3", c: "2" }
for (var name:String in o) {
	o["b"] = "1";
	trace(name, o[name]); // a 3, b 1, c 2
}
trace(o["b"]); // 1
Ой, а тут все свойства на месте... Как же так?

Смысл в том, что цикл for .. in, судя по всему, обходит свойства в алфавитном порядке. При этом (как видно из первого случая) если мы сейчас на свойстве "b", это точно значит, что свойство "а" мы уже прошли (хотя, опять же, как видно из примера - вовсе не значит)
__________________
...вселенская грусть

Старый 16.02.2011, 01:59
expl вне форума Посмотреть профиль Отправить личное сообщение для expl Найти все сообщения от expl
  № 10  
Ответить с цитированием
expl

блогер
Регистрация: Feb 2006
Сообщений: 1,474
Записей в блоге: 3
Цитата:
Сообщение от QuanChi Посмотреть сообщение
Прошу прощения за повторение, по поиску не нашел... с Объектом подобных казусов очевидно не происходит. Видимо бага где-то в глубине методов объекта Array.
Спасиб за отклик

Цитата:
То есть свойство a появляется только по выходе из цикла? Нет, не может быть! Проверим
Код AS3:
var o:Object = { a: "3", c: "2" }
for (var name:String in o) {
	o["b"] = "1";
	trace(name, o[name]); // a 3, b 1, c 2
}
trace(o["b"]); // 1
Ой, а тут все свойства на месте... Как же так?
Если ключи вставляются во время обхода - никто в доках не обещал, что ключ вставиться таким образом, что будет обойден в этом же for in

Вообще говоря, что обход объекта с помощью for in НЕ поломается при удалении элементов в этом for in тоже никто НЕ обещал.
Но работает.


Последний раз редактировалось expl; 16.02.2011 в 02:04.
Создать новую тему Ответ Часовой пояс GMT +4, время: 04:41.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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