Является ли это эффективным использованием метода Array.filter () для поиска и извлечения экземпляра объекта из массива? - PullRequest
1 голос
/ 13 июля 2010

Мне любопытно, если это правильная реализация метода Array.filter().

//Array of generic Object instances representing galleries. 
//The images property is empty for the example
var galleries:Array = new Array();

galleries[0] = {name: 'Portraits', images: new Array()};
galleries[1] = {name: 'Landscapes', images: new Array()};
galleries[2] = {name: 'Still Lifes', images: new Array()};

//Returns a gallery Object by the specified name
function getGallery(galleryName:String):Object
{
    function isGallery(element:*, index:int, arr:Array):Object 
    { 
        return (element.name == galleryName); 
    }

    var arr:Array = galleries.filter(isGallery);
    return arr[0];
}

var gallery:Object = getGallery('Landscapes');
if(gallery != null)
{
    trace(gallery.name);
}
else
{
    trace('Not found.');
}

Это была функция, которую я использовал ранее:

function getGallery(galleryName:String):Object
{
  for each(var gallery:Object in galleries)
  {
    if(galleryName == gallery.name)
    {
      return gallery;
    }
  }
  return null;
}

Я не смогвыяснить реализацию функции обратного вызова для метода filter(), где обратный вызов был вне функции getGallery().Интересно, есть ли способ получить функцию isGallery вне области действия getGallery?

1 Ответ

3 голосов
/ 14 июля 2010

Мне любопытно, если это нормально реализация Array.filter () способ.

Не только ваш код верен, это прекрасный пример. для Array.filter использования.

Я не смог выяснить реализация обратного вызова функция для метода filter (), где обратный вызов был за пределами Функция getGallery ().

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

//Returns a gallery Object by the specified name
function getGallery(galleryName:String):Object
{
    return galleries.filter(function(gallery:*, idx:int, a:Array):Boolean { 
        return (gallery.name == galleryName); 
    }).shift();
}

Обратите внимание на компактный код.

Интересно, есть ли способ получить Функция isGallery вне Объем getGallery?

Это невозможно напрямую, но возможно, если вы сделаете это статической функцией в родительском классе, но зачем это делать? Посмотрите приведенный выше пример кода, он настолько компактен и может использоваться многократно.


В качестве примечания я бы заменил galleries на:

var galleries:Object = {
    'Portraits': [],
    'Landscapes': [],
    'Still Lifes': []
};

Таким образом, ваш метод getGallery становится операцией O (1):

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