Основы цикла for в ActionScript 3 во Flex - PullRequest
0 голосов
/ 23 марта 2011

Доброе утро, переполнение стека ... У меня возникла проблема ... Это мой пример кода

var i:Number = new Number();

trace("showarray length" + showArray.length);

for(i=0;i<showArray.length;i++){

    trace("equal daw" + showArray.getItemAt(i).id + "==" + num);

    if(showArray.getItemAt(i).id == num){
        showArray.removeItemAt(i);

    }
}
trace('alerts');

Моя проблема здесь ... когда бы ни был удовлетворен, он прекращает цикл, он немедленно уходитвне цикла

это пример выходных данных, учитывая, что длина showArray равна 2 и num = 0

длина showarray2

равна daw0 == 0

оповещения

пожалуйста, помогите мне

Ответы [ 5 ]

8 голосов
/ 23 марта 2011

Если вы хотите удалить элементы во время итерации по массиву, выполняйте итерацию в обратном порядке.Таким образом, удаление элемента не влияет на условие цикла:

for (var i:int = showArray.length - 1; i >= 0; i--) {
    if (someCondition) {
        showArray.removeItemAt(i);
    }
}

Еще один небольшой бонус - это немного быстрее, поскольку он не вызывает showArray.length на каждом шаге.

3 голосов
/ 23 марта 2011

Еще лучше использовать метод filter класса Array.

array = array.filter(function (e:*, i:int, a:Array):Boolean {
        return e.id != num;
    });
1 голос
/ 24 марта 2011

После showArray.removeItemAt(i); добавить i--;

Поскольку вы удалили элемент с индексом i из массива, элемент с i + 1 был перемещен в i. Вычитая один, вы гарантируете, что перемещенный элемент не будет пропущен.

Ответ alxx также является хорошим решением.

1 голос
/ 23 марта 2011

Это потому, что вы удаляете элементы во время их итерации.

array = [1, 2]
         ^         // pointer in first iteration

eliminate 1
array = [2]
         ^         // the pointer remains in the same location

//ups! out of the loop. all items were visited.

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

PS: Извините за мой плохой английский.

1 голос
/ 23 марта 2011

Когда ваше if удовлетворено для id == num (что равно 0, что происходит в первом цикле), и элемент удаляется, длина вашего массива уменьшается до 1, поэтому цикл больше не будет выполняться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...