2010-05-11 46 views
26

Esta no era la pregunta que iba a hacer, pero inesperadamente he encallado con arreglos de JavaScript. Vengo de un fondo de PHP y después de mirar algunos sitios web no soy mucho más sabio.matrices multidimensionales de JavaScript

Estoy tratando de crear una matriz multidimensional.

var photos = new Array; 
var a = 0; 
$("#photos img").each(function(i) { 
    photos[a]["url"] = this.src; 
    photos[a]["caption"] = this.alt; 
    photos[a]["background"] = this.css('background-color'); 
    a++; 
}); 

Mensaje de error: las fotos [a] no están definidas. ¿Cómo hago esto? Gracias.

+2

'this.css' no funcionará, tiene que ajustar' this' dentro de un objeto jQuery: '$ (this) .css'. –

+0

Mientras que el título indica un duplicado, lo que el asker realmente quería era una matriz de objetos, no una matriz de matrices. –

Respuesta

35

JavaScript no tiene matrices multidimensionales, sino matrices de matrices, que se pueden utilizar de manera similar.

es posible que desee probar el siguiente:

var photos = []; 
var a = 0; 
$("#photos img").each(function(i) { 
    photos[a] = []; 
    photos[a]["url"] = this.src; 
    photos[a]["caption"] = this.alt; 
    photos[a]["background"] = this.css('background-color'); 
    a++; 
}); 

Tenga en cuenta que podría haber utilizado new Array() en lugar de [], pero este último se recomienda en general. También tenga en cuenta que faltaba el paréntesis de new Array() en la primera línea.


ACTUALIZACIÓN: Después de los comentarios a continuación, en el ejemplo anterior no había necesidad de utilizar matrices de matrices. Una matriz de objetos hubiera sido más apropiada. El código sigue siendo válida porque las matrices son objetos en este idioma, pero el siguiente habría sido mejor:

matrices
photos[a] = {}; 
photos[a]["url"] = this.src; 
photos[a]["caption"] = this.alt; 
photos[a]["background"] = this.css('background-color'); 
+1

Una matriz contiene claves numéricas, no cadenas. – Alsciende

+0

@Alsciende: Ese código es válido. Una matriz es un objeto en JavaScript, y los objetos y las tablas son lo mismo en este idioma. Por lo tanto, 'photos [0] [" url "]' está asignando una propiedad 'url' a' photos [0] '. –

+5

Es válido, pero no es apropiado. No tiene sentido utilizar una matriz en ese caso, es confuso para las personas novatas. – Alsciende

0

multidimensionales están en estas estructuras:

var photos = new Array(); 
photos[0] = new Array(); 

lo utilizan como:

photos[0][0] = this.src; 

más en JS array here.

0

Douglas Crockford, de JSLint, tendría que crear de esta manera ("Use la notación de matriz literal []"):

var photos = []; 

Ahora recuerde que usted desea crear matrices multidimensionales, lo que significa una matriz dentro de una matriz. Esto significa que necesita para crear los interiores-arrays:

$("#photos img").each(function(i) { 
    photos[a] = [] 
    //continue 
5
var photos = []; 
var imgs = document.getElementById("photos").getElementsByTagName("img"); 
for(var i=0;i<imgs.length;i++){ 
    photos.push({ 
     src:imgs[i].src, 
     alt:imgs[i].alt, 
     background:imgs[i].style.backgroundColor 
    }); 
} 

que debe darle algo que es más o menos equivalente a esto en PHP (que hice de seguridad de datos imaginarios):

Array(
    [0] => Array(
     "src" => "logo.png", 
     "alt" => "My Logo!", 
     "background" => "#ffffff" 
    ) 
) 

I ¡espero que esto ayude!

+1

+1 para la codificación en js simple cuando sea posible – Alsciende

+0

gracias por hacer que sea más legible. – tau

15

Usted está tratando de asignar algo a photos[a]["url"], photos[a]["caption"], etc., pero photos[a] no existe. photos es una matriz vacía al principio, por lo que primero tiene que establecer photos[a]. Dado que desea utilizar claves de secuencia ("url", "caption", etc.), este algo debe ser un objeto simple (el javascript equivalente a las matrices php associave) (o un Hash si su base de código lo permite).A continuación, puede utilizar una construcción literal de objeto para simplificar su función, y Array#push para deshacerse de lo innecesario a:

var photos = []; 
$("#photos img").each(function(img) { 
    photos.push({ 
     url: img.src, 
     caption: img.alt, 
     background: img.style.backgroundColor 
    }); 
}); 

Además, asegúrese de que this es en realidad el elemento img. Algunas implementaciones de each establecerán this en el objeto global en su caso.

edición: ok, parece que jQuery.each ajusta automáticamente this al elemento iterado, pero no lo envuelve en jQuery-bondad, así que hay que envolver bien this en $() o utilizar DOM normal (he usado este último en mi ejemplo).

edit2: de todos modos, usar this es un poco extraño ya que la función de devolución de llamada pasada a each recibe un argumento. Bien podría usar este argumento (renombrado).

+0

El único problema con 'this' es que no tiene un método' css'. Primero debe envolverse dentro de un objeto jQuery. –

+0

No sé mucho sobre jQuery. Usaré tu consejo. – Alsciende

2

Cuando leí este hilo, estaba tratando de comprender las matrices asociativas multidimensionales. No estaba claro, así que seguí investigando, esto es lo que se me ocurrió:

var images = new Array; 
images['logo'] = { 'src': 'http://example.com/image1.png', 'caption': 'this is the logo', 'background': '#000'}; 
images['background'] = { 'src': 'http://example.com/image2.png', 'caption': 'this is the background', 'background': '#FFF'}; 
alert(images['logo']['src']); /* output: http://example.com/image1.png */ 
alert(images['background']['caption']); /* output: this is the background */ 

Espero que esto ayude!

Cuestiones relacionadas