这是否有效地使用Array.filter()方法从数组中搜索和检索Object实例?

时间:2010-07-13 18:03:17

标签: flash actionscript-3 arrays search

我很好奇这是否是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 个答案:

答案 0 :(得分:3)

  

我很好奇,如果这是好的   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]