AS3 - 是否可以搜索Array by Object属性?

时间:2009-06-01 01:17:51

标签: actionscript-3

是否可以使用Array.indexOf()通过数组中对象的属性搜索数组:

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()都不起作用,用正确的语法来实现这个目的吗?

5 个答案:

答案 0 :(得分:4)

查看Array的过滤方法(最新可用于AS3)。您可以编写一个过滤器方法,返回符合条件的所有对象(在您的情况下,具有特定名称的动画片段)

答案 1 :(得分:3)

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

如果你真的需要索引,你将需要迭代数组...按键...或者在增量循环中,如果数组是数字和密集... 如果数组是关联的(使用字符串键),你必须使用for-in循环,因为过滤器和相关函数只会覆盖数字索引......

在数值数组中,我建议采用以下两种方法之一:

//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" });

希望有帮助......;)

格尔茨

back2dos

答案 2 :(得分: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"));

答案 3 :(得分:0)

myMovieClip.name == "foo";  

^ ==如果要分配变量,请使用

myMovieClip.name = "foo";

答案 4 :(得分: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。