2009-09-15 18 views
8

¿Cuál es la sintaxis para indexOf() que pasa por una matriz multidimensional? Por ejemplo:indexOf sintaxis para matrices multidimensionales?

var x = []; 
// do something 
x.push([a,b]); 

x.indexOf(a) // ?? 

Quiero encontrar 'a' y hacer algo con 'b'. Pero no funciona ... Como este método debería ser iterativo en sí mismo, no supongo que usar cualquier otra iteración sería bueno. Actualmente simulo esto usando 2 matrices simples, pero supongo que esto también debería funcionar de alguna manera ...

+0

¿Estás tratando para crear un diccionario? ¿Por qué no usar un objeto? '{}' – Joel

+0

¿Alguna de las cuatro sugerencias para codificar esto funciona de manera diferente para usted? Sólo curioso. – dlamblin

Respuesta

0

JavaScript no tiene matrices multidimensionales como tales, por lo que x es simplemente una matriz. Además, el método indexOf de Array no es compatible con todos los navegadores, en particular IE (hasta la versión 7, al menos), que solo se introdujo en JavaScript 1.6.

Su única opción es buscar manualmente, iterar sobre x y examinar cada elemento sucesivamente.

1

A menos que quiera preservar el orden, es mucho más fácil de usar un diccionario:

var x = {}; 

// do something 

x[a] = b; 

Todavía se puede iterar sobre las claves, aunque el orden no está definido:

for (var key in x) { 
    alert(x[key]); 
} 
+0

Usa x [a] en lugar de x.a. "a" no es el nombre clave, sino la variable que contiene la clave. –

+0

cierto. Lo arreglaré. –

0
x[ x.indexOf(a) ] 

Esto solo funcionará con los objetos ordenados/listas y solo si se define Array.prototype.indexOf.

x = [1,2], b = {one:function(){alert('gj')}}, c = x.push(b); 

x[ x.indexOf(b) ]['one']() 
+0

Intenté esto, no funciona por alguna razón ... – jirkap

+0

Bueno, debes haberlo hecho de manera diferente porque la forma en que lo hice funciona. Noté que esto * SOLAMENTE * funciona en arreglos que están ordenados numéricamente y tienen una propiedad de longitud, NO en "multidimensionales" o diccionarios. –

+0

Nota: también necesita tener una referencia al objeto original para la referencia que está alimentando a 'b', un objeto similar con propiedades similares sigue siendo diferente. –

1

Puede utilizar un objeto (o diccionario) como Philippe Leybaert sugirió. Eso permitirá un acceso rápido a los elementos:

var x = {}; 

x[a] = b; // to set 

alert(x[a]) // to access 

Pero si usted insiste en el uso de indexOf, todavía hay una manera, sin embargo feo que es:

var x = []; 

var o = Object(a); // "cast" to an object 
o.b = b; // attach value 

x.push(o); 

alert(x.indexOf(a)); // will give you the index 
alert(x[1].b); // access value at given index 
3

Simplemente: indexOf() no funciona de esta manera. Podría funcionar si hiciera algo como esto:

var x = []; 
// do something 
z = [a,b]; 
x.push(z); 

x.indexOf(z); 

Pero entonces usted ya tendría z.b ¿No es así? Lo que si debe ignorar el consejo de todos los que piensan que el uso de un objeto (o diccionario) es en realidad más fácil que tendrá que usar ya sea Ates Goral 's approach, o busque el índice de sí mismo:

Array.prototype.indexOf0 = 
    function(a){for(i=0;i<this.length;i++)if(a==this[i][0])return i;return null;}; 
var x = []; 
// do something 
x.push([a,b]); 

x.indexOf0(a); //=> 0 
Cuestiones relacionadas