2011-01-21 16 views
9

tengo una matriz de JavaScript de objetos como esto:¿Cómo obtener el índice de un objeto dentro de una matriz de objetos?

box[0] = {...} 
box[1] = {...} 
box[2] = {...} 
... 
box[499] = {...} 

Este objetos son generados por el mismo constructor y se añaden a la matriz dentro de un bucle. Los objetos tienen métodos en el prototipo que necesitan saber Índice del objeto en la matriz para hacer sus cosas. Actualmente lo que estoy haciendo es establecer una propiedad llamada id dentro de cada objeto cuando creo que dentro del bucle, igual al índice de matriz. Algo como esto:

box[i].id = i; 

Sin embargo no estoy totalmente satisfecho con esto, porque cada vez que vuelvo a solicitar la matriz mediante sort() que tiene que ejecutar un bucle para actualizar los id propiedades con los nuevos valores de índice.

Mi pregunta es si hay una manera de saber dentro de un objeto es índice en la matriz, sin tener que establecer la propiedad de identificación, espero que pueda ayudarme.

Gracias de antemano.

+1

Creo que si los métodos del objeto necesitan saber el índice de su objeto, que no pertenecen a los objetos. Pertenecen en una instancia singleton o en la matriz. – staticsan

+0

Vea la buena respuesta de patrick. Este tipo de acoplamiento conduce invariablemente a muchas fallas; el caso señalado es solo la "punta" del problema. Tal vez haya una solución factible para una pregunta diferente (pero relacionada). –

Respuesta

19

no creo que una función dentro de un objeto en la matriz va a ser conscientes de que el índice de la matriz que está haciendo referencia a ella.

Como cada elemento de la matriz apunta simplemente a ese objeto en la memoria, es posible que haya docenas de elementos de matriz, variables, propiedades de objeto, etc. que hacen referencia al mismo objeto, por lo que la función (o el objeto que contiene función) no sabría qué referencia posterior está esperando hacer.

supongo que tendremos que aguantar haciendo lo que estás haciendo si necesita conocer su índice de la matriz.

Supongo que la función podría llamar a indexOf() contra la matriz, ya que devuelve index, pero eso requeriría un poco de sobrecarga para cada llamada, y deberá agregarlo para los navegadores no compatibles.

theArr.indexOf(this); // assuming the function was called from the context 
         // of the object in question 
2

¿Por qué no agrega una propiedad única en cada objeto y utiliza esa propiedad para buscar el índice de ese objeto.

Si usted tiene un constructor puede añadir un _id y después de que las operaciones de búsqueda ID usando:

function getIndex(box, objectId) { 
    var index = box.map(function(e) { return e._id; }).indexOf(objectId); 
    return index; 
} 

Esto funcionará incluso si ordena la matriz, pero que necesita para mantener el identificador único.

Array.prototype.map no está disponible en IE7 o IE8. ES5 Compatibility

por cierto, no me gusta esta solución pero va a trabajar en su problema :)

Cuestiones relacionadas