PDA

Просмотр полной версии : число из массива в массив = объект?


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
Все правильно. В массиве может быть что угодно. Надо кастить, если надо.проблема в другом
если 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
А, точно. Просто в классах компиллятор ругается, если не кастить. Ну он-то не знает, что в массиве, а плеер уже знает.
А почему просто не написать
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.php?p=602943#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
Вот это монументально! :)