2009-06-01 10 views
6

byłoby możliwe użycie Array.indexOf() do przeszukiwania tablicy właściwościami obiektów w tablicy:AS3 - Czy można przeszukiwać właściwości Array by Object?

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

myMovieClip.name = "foo"; 

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

lub

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

Zarówno indexOf() powyżej, nie pracy, czy jest tam, aby osiągnąć to przy prawidłowej składni?

Odpowiedz

3

indeks będzie wyszukać wpis ... MovieClip.name == „foo” należy wyrzucić błąd kompilatora, ponieważ MovieClip nie posiada właściwość „imię” ... myMovieClip.name == „foo” będzie prawda, a następnie dostaniesz indeks prawdziwe, jeśli jest w tablicy w ogóle ...

jeśli naprawdę potrzebujesz indeks, trzeba iteracyjne nad tablicy ... przez klucz ... lub przyrostowego pętli, jeśli tablica jest numeryczne i gęsty ... jeśli tablica jest łączne (ciąg klawiszy używane), które koniecznie trzeba użyć dla w pętli, ponieważ funkcje filtrów i pokrewne obejmie tylko indeksy numeryczne ...

w tablicy numerycznej, polecam jedną z dwóch następujących metod:

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

nadzieję, że pomogło ...;)

greetz

back2dos

4

spojrzenie na metody filtra Array (nowo dostępna dla AS3). Można napisać metodę filtrowania, która zwraca wszystkie obiekty, które spełniają te kryteria (w przypadku, MovieClip z pewnym nazwa)

0
myMovieClip.name == "foo"; 

^== jeśli chcesz przypisać zmienną, należy

myMovieClip.name = "foo"; 
+0

Niezupełnie odpowiedź, eh? –

+0

Oryginalny pytanie, „Zarówno indexOf() powyżej nie działa”, ale mam podając błąd powodujący, że udało indexOf – Unreality

2

Choć metoda back2dos' jest super, myślę, że początkujący mogą uznać za nadmiernie skomplikowane, dlatego w trosce o nich tu jest prostszy sposób, że może być łatwiejsze w użyciu, choć nie będzie tak wszechstronny w każdej sytuacji jako metoda 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

Oto co zrobiłem. Zmień nazwę funkcji, jeśli chcesz ... to wszystko tylko ze względu na wyjaśnienie.

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; 
} 

Powoduje zwrócenie obiektu zamiast tylko indeksu. Jeśli dopasowanie nie zostanie znalezione, funkcja zwróci wartość null.

Powiązane problemy