Форум 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)
-   -   число из массива в массив = объект? (http://www.flasher.ru/forum/showthread.php?t=97713)

chingachgoog 27.06.2007 20:36

число из массива в массив = объект?
 
Что-то какой-то вывих мозга под конец рабочего дня :)

Код:

arrY0=[]
for (var i=0; i<4; i++) {
        arrY0[i]=i
        trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
       
arrYk=[]

for (var i=0; i<4; i++) {
        id=Math.round(Math.random()*(arrY0.length-1))
        trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
        arrYk.push(arrY0.splice(id, 1))
        trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}

Выводит в Output:

number 0 arrY0
number 1 arrY0
number 2 arrY0
number 3 arrY0
id 0 number 0
object 0 push 1
id 0 number 1
object 1 push 2
id 1 number 3
object 3 push 3
id 0 number 2
object 2 push 4

Как так?
Берет из массива число, записывает (push) в другой массив, читает его как число, но это НЕ ЧИСЛО, а объект?

Kikasso 27.06.2007 20:38

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

chingachgoog 27.06.2007 20:46

Все разобрался таки :)
Как обычно все просто
Код:

arrY0=[]
for (var i=0; i<4; i++) {
        arrY0[i]=i
        trace(typeof(arrY0[i])+" "+arrY0[i]+" arrY0")
}
       
arrYk=[]

for (var i=0; i<4; i++) {
        id=Math.round(Math.random()*(arrY0.length-1))
        trace("id "+id+" "+typeof(arrY0[id])+" "+arrY0[id])
        arrYk.push(arrY0.splice(id, 1)[0])
        trace(typeof(arrYk[i])+" "+arrYk[i]+" push "+arrYk.length)
}

Разница вот в чем:
было arrYk.push(arrY0.splice(id, 1))
стало arrYk.push(arrY0.splice(id, 1)[0])

т.е. splice возращает массив все-таки, хотя бы состоящий и из одного элемента, а это уже объект.

Теперь все нормуль:
number 0 arrY0
number 1 arrY0
number 2 arrY0
number 3 arrY0
id 1 number 1
number 1 push 1
id 2 number 3
number 3 push 2
id 0 number 0
number 0 push 3
id 0 number 2
number 2 push 4

iNils 27.06.2007 20:47

Цитата:

Сообщение от Kikasso
Все правильно. В массиве может быть что угодно. Надо кастить, если надо.

проблема в другом
если arrY0 имеет вид [1,2,3,4], то arrYk [[1],[2],[3],[4]]

Kikasso 27.06.2007 20:55

А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать
Код:

arrYk.push(arrY0[id]);
слайсы тут какие-то..

chingachgoog 27.06.2007 21:01

Цитата:

Сообщение от Kikasso
А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать
Код:

arrYk.push(arrY0[id]);
слайсы тут какие-то..

Это перемешивалка массива потомучто.
см. параметр id, родительский массив постепенно удаляется.

Kikasso 27.06.2007 21:06

А, точно, там splice.
Код:

var arr:Array = [1,2,3,4,5,6,7,8,9];
function f():Number{return random(2);}
arr.sort(f);
trace(arr);

Чей код, не знаю. Не совсем точно.

chingachgoog 27.06.2007 21:23

Изящное решение!

Но основано скорее на глюке, кстати вот интересно проследить параметр n запуская несколько раз код
Код:

arr = [1,2,3,4,5,6,7,8,9];
n=0
function f(){
        n++
        return  random(2);
        }
arr.sort(f);
trace(arr+" "+n);

а я по-простому делал... в лоб...
век живи - век учись!

Kikasso 27.06.2007 21:27

У вас не совсем надежно - лучше не round() делать, а floor().
Вот навалял - надежно, не совсем правда рационально.
Код:

var arr:Array = [];
var n = 100;
while (n--) arr.push(n);
var t = getTimer();

var iArr:Array = [];
for (var i = 0; i< arr.length; i++ ) iArr.push( { r:Math.random(), n:i });       
function f(a,b):Number{return (a.r - b.r);}
iArr.sort(f);
var out:Array = [];
while( iArr.length ) out.push( arr[ iArr.pop().n ]);

trace(out);
trace( 'ms: ' + (getTimer() - t )); //5ms

вот нашлась тема: http://flasher.ru/forum/showthread.p...943#post602943
Оказалось, вот этот наваляный вариант втрое быстрее, чем тот который я использовал )) splice() все-таки медленно работает.
Сравните:
Код:

var myArr:Array = [];
var n = 100;
while (n--) myArr.push(n);
var t = getTimer();
// копия
var arr:Array = myArr.concat();
var out:Array = [];
var num:Number = arr.length;
while ( num > 0 ){
        // случайный индекс
        var rnd:Number = Math.floor (Math.random () * num );
        // выдергиваем элемент с этим индексом из массива
        out.push(arr.splice( rnd, 1 )[0] );
        // длинна массива уменьшилась
        num--;
}

trace(out);
trace( 'ms: ' + (getTimer() - t ));//14 ms

Вариант уважаемого wvxvw еще медленнее.

chingachgoog 27.06.2007 21:56

Вот это монументально! :)


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

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