2010-07-13 53 views
1

我很好奇,如果这是一个好的执行Array.filter()方法。这是Array.filter()方法用于从数组中搜索和检索Object实例的有效用法吗?

//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()功能之外。我想知道是否有办法在getGallery范围之外获得isGallery函数?

回答

3

我很好奇,如果这是一个不错的 实现Array.filter() 方法。

不仅你的代码是正确的,它是一个完美的例子。为Array.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(); 
} 

通知的紧凑的代码。

我不知道是否有一种方式来获得的 getGallery范围之外的 isGallery功能?

这是不可能的,但是如果你在父类中使它成为一个静态函数是可能的,但为什么这样做呢?看到上面的代码示例,它本身非常紧凑和可重用。


作为一个方面说明,我会更换整个galleries有:

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

所以你 'getGallery' 的方法变成O(1)操作:

galleries[name] 
+0

这是非常很有帮助。匿名函数的紧凑方面现在很有意义。此外,你的建议,使画廊一个对象是辉煌的。谢谢! – 2010-07-15 16:33:00

+0

很高兴帮助:) – LiraNuna 2010-07-16 03:30:27

相关问题