2011-02-02 3 views
8

Я не могу заставить функцию map() работать вообще с классом Vector.Как векторная карта() работает в ActionScript 3?

Результат всегда возвращается null - он должен вернуть мне новый вектор со значениями, возвращаемыми функцией addFive (этот пример, очевидно, не является моим реальным usecase).

Версия массива работает должным образом.

Кому-нибудь повезло с получением карты() для работы с Vector?

public function test_vector_map():void { 
     var v1:Vector.<uint> = new <uint>[1,2,3]; 
     trace(v1); // traces 1,2,3 

     var v2:Vector.<uint> = v1.map(addFive); 
     trace(v2); // traces null 
    }    

    protected function addFive(item:uint, index:int, vector:Vector.<uint>):uint 
    { 
     return item+5; 
    } 

    public function test_array_map():void { 
     var v1:Array = [1,2,3]; 
     trace(v1); // traces 1,2,3 
     var v2:Array = v1.map(addSix); 
     trace(v2); // traces 7,8,9 
    }    

    protected function addSix(item:uint, index:int, array:Array):uint 
    { 
     return item+6; 
    } 
+0

Подтверждено: вектор v1 не изменяется функцией map(). – Stray

+0

Подтверждено: передача либо v1, либо самого тестового класса в качестве объекта «this» (второй необязательный параметр для использования, где есть эта ссылка в функции) не имеет значения. – Stray

+0

Подтверждено: использование функции addFive локально для кода, который запускает карту, также не имеет никакого значения. – Stray

ответ

8

Это ошибка в действии/flash-проигрыватель. Кажется, adobe исправил его внутренне, но с Flash Player 10.1 исправление не было выпущено.

См: https://bugzilla.mozilla.org/show_bug.cgi?id=513095

, которая является основной причиной нашей ошибки здесь:

https://bugzilla.mozilla.org/show_bug.cgi?id=507501

Лучшее, что вы можете сделать для теперь придерживаться использования массивов, когда Карта необходима

+2

Спасибо, что нашли это для меня - по крайней мере, я не схожу с ума. – Stray

3

Странно ... Я вижу ваши подтверждения. Вы всегда можете пойти с этим решением:

var v1:Vector.<uint> = new <uint>[1,2,3]; 
trace(v1); // traces 1,2,3 

var v2:Vector.<uint> = v1.slice(); 
v2.forEach(addFive); 
trace(v2); // traces 6,7,8 
+0

Спасибо. Я старался использовать более удобные функции map/filter etc. Обычно я использую цикл for (var i ...) для этих вещей (быстрее, чем forEach), поэтому я вернусь к длинному рука. Приветствия, подтверждающие это для меня. – Stray

Смежные вопросы