2009-06-01 172 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。

相關問題