Просмотр полной версии : Изменение данных в массиве
Bletraut
14.09.2015, 19:42
Собственно возможно ли быстро, без перебора каждого элемента, превратить вот это
var a:Array = ["1", "2", "3", "4", "5"]
вот в это
a = [1, 2, 3, 4, 5]
???
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
Спасибо!
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 );
вот такую типизацию еще можно использовать
Вот это вообще идеально!
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:
если кто-то будет когда-то это читать, знайте что тестить в дебаге не верно и в релизе получились совсем иные результаты.
самый быстрый - цикл с обратным перебором.
Работает на vBulletin ® версия 3.7.3. Copyright ©2000-2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Copyright © 1999-2008 Flasher.ru. All rights reserved.