PDA

Просмотр полной версии : Изменение данных в массиве


Bletraut
14.09.2015, 19:42
Собственно возможно ли быстро, без перебора каждого элемента, превратить вот это
var a:Array = ["1", "2", "3", "4", "5"]
вот в это
a = [1, 2, 3, 4, 5]

???

illuzor
14.09.2015, 19:47
Без перебора никак

AlexCooper
14.09.2015, 20:17
function setUintType(value:String, index:int, array:Array):uint
{
return uint(value);
}

a = a.map(setUintType, null);

Добавлено через 11 минут
но это так же перебор элементов. Просто упрощение сокращение записи. Можно свести до

a = a.map(function(...v):uint{return v[0]}, null);


Добавлено через 1 час 5 минут
Провёл замеры.

package
{
import flash.display.Sprite;
import flash.utils.getTimer;
import flash.utils.setTimeout;

public class w2 extends Sprite
{
private var a:Array;
private var t:int;
private var funcRoute:Array;

public function w2()
{
a = [];

var count:uint = 1000000;

while(--count) {
a.push( String( uint(Math.random()*1000) ) );
}

funcRoute = [ undefinedFunc, undefinedMultiFunc, externalFunction, internalfunction, forinFunction, foreachFunction];

nextstep();

}

private function undefinedFunc():void
{
start();

var b:Array = a.map
( function(value:String, index:int, array:Array):uint{ return uint(value); },
null
);

calc();

nextstep();
}


private function undefinedMultiFunc():void
{
start();

var b:Array = a.map(function(...v):uint{return v[0]}, null);

calc();

nextstep();
}

private function externalFunction():void {

start();

var b:Array = a.map(setUintType, null);

calc();

nextstep();
}

private function internalfunction():void
{
start();

function internalfunc(value:String, index:int, array:Array):uint
{
return uint(value);
}

var b:Array = a.map(internalfunc, null);

calc();

nextstep();
}

private function forinFunction():void
{
var b:Array = [];

start();

for(var i:uint=0; i<a.length; i++) {
b.push(uint(a[i]));
}

calc();

nextstep();
}

private function foreachFunction():void
{
var b:Array = [];

start();

for each(var v:String in a){
b.push( uint(v) );
}

calc();

nextstep();
}

private function calc():void
{

var timeoffset:uint = getTimer()-t;

var err:Object;

try {
err.call();
} catch (e:*) {

var msg:String = e.getStackTrace();

var arr:Array = msg.split('/');

var caller:Array = arr[2].split('(');

var functname:String = caller[0];

}

trace(functname+" -> "+ timeoffset);
}

private function start():void
{
t = getTimer();
}

private function setUintType(value:String, index:int, array:Array):uint
{
return uint(value);
}

private function nextstep():void
{
if (funcRoute.length) {
setTimeout( funcRoute.shift(), 3000);
}
}
}
}

undefinedFunc -> 392
undefinedMultiFunc -> 855
externalFunction -> 369
internalfunction -> 382
forinFunction -> 419
foreachFunction -> 257

наиболее продуктивным будет вариант

var b:Array = [];
for each(var v:String in a){
b.push( uint(v) );
}
a = b;

Bletraut
14.09.2015, 21:44
Спасибо!

nuToH
15.09.2015, 18:26
var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать

Bletraut
15.09.2015, 18:43
var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать

Вот это вообще идеально!

udaaff
16.09.2015, 01:18
for можно слегка ускорить.
for(var i:int = a.length - 1; i > -1; i--) {
b[i] = int(a[i]);
}
+ самый быстрый вариант у меня получился
for (var i:int in a)
{
b[i] = int(a[i]);
}

undefinedFunc -> 260
undefinedMultiFunc -> 550
externalFunction -> 235
internalfunction -> 234
forFunction -> 250
foreachFunction -> 141
forinFunction -> 110
newforFunction -> 140
array2vectorFunction -> 265

var a:Array = ["1", "2", "3", "4", "5"];
var b:Vector.<Number> = Vector.<Number>( a );
вот такую типизацию еще можно использовать
Медленнее цикла, кстати, получается.

+ for each + push не гарантируют порядок элементов, если в массиве будут отсутствоват элементы.

upd:
если кто-то будет когда-то это читать, знайте что тестить в дебаге не верно и в релизе получились совсем иные результаты.
самый быстрый - цикл с обратным перебором.