Array.filter для динамического тестирования значений - PullRequest
4 голосов
/ 11 сентября 2009

это из документов Adobe :

package {
    import flash.display.Sprite;
    public class Array_filter extends Sprite {
        public function Array_filter() {
            var employees:Array = new Array();
            employees.push({name:"Employee 1", manager:false});
            employees.push({name:"Employee 2", manager:true});
            employees.push({name:"Employee 3", manager:false});
            trace("Employees:");
            employees.forEach(traceEmployee);

            var managers:Array = employees.filter(isManager);
            trace("Managers:");
            managers.forEach(traceEmployee);
        }
        private function isManager(element:*, index:int, arr:Array):Boolean {
            return (element.manager == true);
        }
        private function traceEmployee(element:*, index:int, arr:Array):void {
            trace("\t" + element.name + ((element.manager) ? " (manager)" : ""));
        }
    }
}

Проблема в методе фильтра класса Array. Это работает следующим образом: вы передаете функцию в качестве аргумента фильтра, и массив возвращается на основе функции, которую вы передаете. Проблема в том, что вы не можете добавить какой-либо другой параметр. Таким образом, если вы должны создать (например, в цикле for) 4 массива из одного и того же массива и хотите использовать одну и ту же функцию, вы можете проверить только свойство класса, для которого вы должны предварительно установить значение, которое вы хотите проверить ,

Есть ли другой способ добавить этот параметр?

Ответы [ 3 ]

3 голосов
/ 09 сентября 2010

При фильтрации по переменным свойствам объекта в массиве я включил фильтрацию в другую функцию:

protected function FilterByProperty(input_array:Array, extra_testing:Object):Array
{
    function FilterFunction(element:Object, index:int, array:Array):Boolean
    {
        return element.property == extra_testing; // Arbitrary test
    }

    return input_array.filter(FilterFunction);
}

var filtered_array:Array = FilterByProperty(unfiltered_array, test_property);
2 голосов
/ 05 января 2012

Вы можете использовать второй параметр метода filter () для передачи данных в функцию фильтра. Это будет доступно как переменная "this". Для этого первым параметром должно быть замыкание, а не метод класса.

var array:Array = [...];
var params:Object = {"param1": value1, "param2": value2};

var filterFunction:Function = function(item:*, index:int, array:Array):Boolean {
    var param1 = this["param1"];
    var param2 = this["param2"];
};

array.filter(filterFunction, params);
0 голосов
/ 11 сентября 2009

Вы хотите использовать что-то вроде Делегаты или функции привязки, или замыкания. В зависимости от вашего кодирования и терминологии предпочтений. Идея, стоящая за ними, заключается в том, что вы создаете динамическую оболочку функции для основной функции «фильтра». Эта оболочка будет иметь доступ к дополнительным параметрам, которые вы передаете. Итак, при первом вызове вы можете перейти:

a.filter(Delegate.create(myFunc, param1));

и в следующий раз:

a.filter(Delegate.create(myFunc, param2));

и ваша функция будет выглядеть примерно так:

private function myFunc(item:*, index:Number, a:Array, param:Object=null):Boolean{}

Быстрый грязный метод - просто передать встроенную функцию, подобную этой:

a.filter(
  function(item:*, index:Number, a:Array):Boolean { 
    return myFunc(item,index,a,param1); 
  }
); 

где param1 передается с использованием замыкания, созданного определением функции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...