Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   ActionScript 1.0/2.0 (http://www.flasher.ru/forum/forumdisplay.php?f=93)
-   -   Метод Array.splice() (http://www.flasher.ru/forum/showthread.php?t=118042)

ilya_ 13.11.2008 11:26

Метод Array.splice()
 
Привет!
В цикле использую метод Array.splice(), но он неправильно работает или я неправильно делаю
Код:

a=[[1,1,1],[2,2,2],[3,3,3]]
b=[]
for(i=0;i<3;i++){
        b[0]=i
        b[1]=i
        b[2]=i
        trace(b)                       
        a.splice(i,0,b)               
        trace(a)
}

вот какой результат выдаёт
0,0,0
0,0,0,1,1,1,2,2,2,3,3,3
1,1,1
1,1,1,1,1,1,1,1,1,2,2,2,3,3,3
2,2,2
2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,3,3,3

а вот что по моей логике должно быть
0,0,0
0,0,0,1,1,1,2,2,2,3,3,3
1,1,1
0,0,0,1,1,1,1,1,1,2,2,2,3,3,3
2,2,2
0,0,0,1,1,1,2,2,2,1,1,1,2,2,2,3,3,3

Подскажите что не так.

iNils 13.11.2008 11:43

Массив после после цикла по сути выглядит так
a=[b,b,b,[1,1,1],[2,2,2],[3,3,3]]
где b массив равный в конце [2,2,2], вот и получаете 2,2,2,2,2,2,2,2,2,1,1,1,2,2,2,3,3,3
Код AS1/AS2:

a = [[1, 1, 1], [2, 2, 2], [3, 3, 3]];
for (var i = 0; i < 3; i++) {
        a.splice (i, 0, [i, i, i]);
        trace (a);
}


Alkaz 13.11.2008 11:55

вот здесь:
Код AS1/AS2:

a.splice(i,0,b)

вы добавляете в массив а ссылку на массив b, но не его содержимое, а в следующей итерации вы меняете содержимое b, оно меняется и в а, потому что там хранится ссылка на b. надеюсь примерно понятно объяснил:)
спасет вам например так:
Код AS1/AS2:

a=[[1,1,1],[2,2,2],[3,3,3]]
b=[]
for(i=0;i<3;i++){
        b = new Array()
        b[0]=i
        b[1]=i
        b[2]=i
        trace(b)                       
        a.splice(i,0,b)               
        trace(a)
}

но в памяти при этом у вас будет храниться 3 разных объекта b. я бы по другому как-нибудь это сделал.

edge1 27.02.2009 21:33

Цитата:

Сообщение от Alkaz (Сообщение 776685)
вот здесь:
Код AS1/AS2:

a.splice(i,0,b)

вы добавляете в массив а ссылку на массив b, но не его содержимое

А как добавить в массив a содержимое массива b?

Fatality 27.02.2009 23:05

Код AS1/AS2:

a.splice(i,0,b.slice());


edge1 02.03.2009 12:34

Цитата:

Сообщение от Fatality (Сообщение 801694)
Код AS1/AS2:

a.splice(i,0,b.slice());


Масло масленное? Splice в упор не желает работать с b как с массивом.

ps: Хочу уточнить что я использую ас3.

Добавлено через 36 минут
Вообще что-то странное творится.
Код AS3:

                        trace( b.length );
                        trace( a.length );
                        var c : Array = new Array();
                        c = a.splice( 4 );
                        trace( c.length );
                        a.concat( b );
                        a.concat( c );
                        trace( a.length );

Выдает следущее:
4
31
27
4

Добавлено через 1 час 3 минуты
В результате результат был достигнут:
Код AS3:

                        var c : Array = new Array();
                        c = a.splice( 4 );
                        b.forEach( pushElement );
                        c.forEach( pushElement );
                        function pushElement( element : *, index: int, array: Array ) : void
                        {
                                a.push( element );
                        }



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

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