2014-06-13 1 views
0

J'ai un tableau qui, par exemple, est 2d et ressemble à ceci: `var arr = [[" 1 "," 2 "," 3 "], [ "4", "5"], ["6"]]; 'Si l'élément est dans une dimension quelconque du tableau multidimensionnel

Lorsque j'exécute $.inArray("4", arr); ou arr.indexOf("4"), j'obtiens -1 signifiant qu'il n'est pas dans le tableau. Cependant, il est dans l'un des tableaux internes.

Comment puis-je savoir s'il se trouve dans le tableau ou dans des tableaux qui sont des éléments du tableau? En d'autres termes dans n'importe quelle dimension du tableau.

+0

récursivité ......... – adeneo

+0

@adeneo donc, appel dans tableau quand un tableau est trouvé comme un élément dans le tableau? mais comment je fais inArray ou index de si ce tableau interne n'est pas affecté à un var? – MrGuru

+0

Essayez d'abord d'aplatir le tableau, par exemple en utilisant '$ .map' –

Répondre

1

Vous pouvez faire:

var arr = [["1", "2", "3"], ["4", "5"], ["6"]]; 
if(arr.join().split(',').indexOf("4") != -1){ 
    // do something.  
} 

.join() convertit le tableau en éléments séparés par des virgules et .split(',') crée un nouveau tableau, qui est aplati. Donc, .indexOf() fonctionne maintenant.

+0

Ceci retourne 'true' si 4 n'est pas dans les tableaux, mais 14 est. Ce n'est pas ainsi que vous recherchez un élément dans un tableau imbriqué (conversion en une représentation de chaîne). – Ian

+1

@lan ce n'est pas une représentation sous forme de chaîne, cette solution fonctionne en fait. –

+0

@KingKing Crap, je me concentrais sur la partie '.join()' et j'ai oublié de '.split()'. Cela semble fonctionner, aussi longtemps que l'entrée est un tableau 2d avec des nombres simples – Ian

2

La meilleure solution technique consisterait à créer une fonction récursive qui recherche une valeur dans une matrice.

Si le tableau est seulement deux niveaux de profondeur comme dans l'exemple il y a aussi une solution plus pratique: aplatir le tableau et il suffit d'utiliser indexOf:

var arr = [["1", "2", "3"], ["4", "5"], ["6"]]; 
var flattened = Array.prototype.concat.apply([], arr); 
alert(flattened.indexOf("4")); 
Questions connexes