2009-06-01 4 views
6

¿Sería posible utilizar Array.indexOf() para buscar a través de una matriz por las propiedades de los objetos dentro de la matriz:AS3 - ¿Es posible buscar una matriz por propiedades de Objeto?

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

myMovieClip.name = "foo"; 

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

O

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

Tanto indexOf() anterior no hacer trabajo, ¿existe para lograr esto con la sintaxis correcta?

Respuesta

3

índice de la búsqueda de una entrada ... MovieClip.name == "foo" debería arrojar un error de compilación, ya que MovieClip no tiene una propiedad "nombre" ... myMovieClip.name == "foo" será true, y luego obtendrá el índice verdadero, si está en la matriz en absoluto ...

si realmente necesita el índice, tendrá que iterar sobre la matriz ... por la tecla ... o en un bucle incremental, si la matriz es numérica y densa ... si la matriz es asociativa (claves de cadena utilizado) que imperativamente necesario utilizar para-en bucles, ya que las funciones de filtro y hace referencia únicamente cubrirán los índices numéricos ...

en una matriz numérica, me gustaría sugerir uno de los dos métodos siguientes:

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

esperanza que ayudó ...;)

greetz

back2dos

4

Mire en el método de filtro de Array (recién disponible para AS3). Puede escribir un método de filtro que devuelve todos los objetos que satisfagan sus criterios (en su caso, un clip de película con un cierto nombre)

0
myMovieClip.name == "foo"; 

^== si desea asignar una variable, utilice

myMovieClip.name = "foo"; 
+0

No es realmente una respuesta, ¿eh? –

+0

La pregunta original, "Ambos indexOf() de arriba no funcionan", pero estoy diciendo que el error que causó el indexOf falló – Unreality

2

Aunque método back2dos' es fresco, creo que los principiantes que le resulte excesivamente complicado, así que por el bien de ellos aquí es un método más simple, que puede ser más fácil de usar, aunque no será tan versátil para cualquier situación como método de 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

Esto es lo que hice. Cambia el nombre de la función si quieres ... esto es solo por el bien de la explicación.

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

Esto devuelve el objeto en lugar de solo un índice. Si no se encuentra una coincidencia, la función devuelve nulo.

Cuestiones relacionadas