Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 3.0 (http://www.flasher.ru/forum/forumdisplay.php?f=83)
-   -   Парадокс! при удалении свойств в цикле for in (http://www.flasher.ru/forum/showthread.php?t=150657)

QuanChi 15.02.2011 22:17

Парадокс! при удалении свойств в цикле 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 штук.. и если в процессе цикла мы удаляем свойства в предыдущей пачке зависает одно значение.. как-то... О_о

nOobCrafter 15.02.2011 22:50

а обычным массивом все корректно удаляется? массив не уменьшает размер?

QuanChi 15.02.2011 23:09

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

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

Bgg 15.02.2011 23:17

Да, забавно. Перебирает все, а удаляет не все.
Присваивайте null каждому элементу, или просто новый экземпляр Array создавайте.

expl 15.02.2011 23:51

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

QuanChi 16.02.2011 00:31

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

Bgg 16.02.2011 00:36

Цитата:

А это не баг, это неверное использование for in. При удалении ключей происходит смещение индексов и появляются пропуски ключей.
Ждем etc.

samana 16.02.2011 00:55

Да, странно получается.... Наверно для таких целей лучше использовать просто цикл for, а не for in.

gloomyBrain 16.02.2011 01:32

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

expl 16.02.2011 01:59

Цитата:

Сообщение от QuanChi (Сообщение 973653)
Прошу прощения за повторение, по поиску не нашел... с Объектом подобных казусов очевидно не происходит. Видимо бага где-то в глубине методов объекта 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 тоже никто НЕ обещал.
Но работает.


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

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