2009-06-01 122 views
6

才有可能使用Array.indexOf()由阵列内的对象的属性通过阵列搜索:AS3 - 是否有可能通过对象属性搜索数组?

var myArray:Array = new Array(); 
var myMovieClip = new MovieClip(); 

myMovieClip.name = "foo"; 

myArray.push(myMovieClip); 
myArray.indexOf(MovieClip.name == "foo"); //0 

OR

myArray.indexOf(myMovieClip.name == "foo"); //0 

两者的indexOf()以上不工作,是否有正确的语法来实现这一目标?

回答

3

索引将搜索条目... MovieClip.name ==“foo”应该抛出编译器错误,因为MovieClip没有属性“名称”... myMovieClip.name ==“foo”将会是true,然后你会得到真正的索引,如果它在所有的数组中...

如果你真的需要索引,你将需要遍历数组... ...通过键......或者在增量循环中,如果数组是数字和密集的... 如果数组是关联的(字符串键使用),你需要势在必行用于-在循环中,因为过滤器和相关功能将只包括数字索引...

在数字阵列

,我建议以下两种方法之一:

//this will return an array of all indices 
myArray.map(function (val:*,index:int,...rest):int { return (val.name == "foo") ? index : -1 }).filter(function (val:int,...rest):Boolean { return val != -1 }); 

//here a more reusable utility function ... you may want to put it to some better place ... just as an example ... 
package { 
    public class ArrayUtils { 
      public static function indexOf(source:Array, filter:Function, startPos:int = 0):int { 
       var len:int = source.length; 
       for (var i:int = startPos; i < len; i++) 
        if (filter(source[i],i,source)) return i; 
       return -1; 
      } 
    } 
} 
//and now in your code: 
var i:int = ArrayUtils.indexOf(myArray, function (val:*,...rest):Boolean { return val.name == "foo" }); 

希望有帮助...;)

greetz

back2dos

4

查看Array的过滤方法(新近可用于AS3)。你可以写一个返回,将符合条件的所有对象的过滤方法(在你的情况,具有一定名称的影片剪辑)

0
myMovieClip.name == "foo"; 

^==如果你想分配一个变量,使用

myMovieClip.name = "foo"; 
+0

不是一个真正的答案,呃? – 2009-06-01 01:45:30

2

虽然back2dos'的方法是冷静,我觉得初学者可能会发现它过于复杂,所以对他们的缘故这里是一个简单的方法,这可能是更容易使用,但不会像作为back2dos的方法,任何情况都是多功能的。

var myArray:Array = new Array(); 
var myMovieClip1 = new MovieClip(); 
var myMovieClip2 = new MovieClip(); 

myMovieClip1.name = "foo"; 
myMovieClip2.name = "bar"; 

myArray.push(myMovieClip1); 
myArray.push(myMovieClip2); 

function getIndexByName(array:Array, search:String):int { 
    // returns the index of an array where it finds an object with the given search value for it's name property (movieclips, sprites, or custom objects) 
    for (var i:int = 0; i < array.length; i++) { 
     if (array[i].name == search) { 
      return i; 
     } 
    } 
    return -1; 
} 

trace("bar index = "+getIndexByName(myArray, "bar")); 
trace("foo index = "+getIndexByName(myArray, "foo")); 
0

这是我做的。更改函数名称,如果你想...这只是为了解释。

getObjectFromArrayByProperty(arrayToSearch, 'oBjectProperty', 'value'); 

function getObjectFromArrayByPoperty(array:Array, _property, search:String):Object{ 
    for (var i:int = 0; i < array.length; i++) { 
     if (array[i][_property] == search) { 
       return array[i]; 
     } 
    } 
    return null; 
} 

这会返回对象而不是索引。如果找不到匹配,则该函数返回null。

相关问题