2011-09-22 9 views
9

Estoy tratando de crear una galería de Flickr muy básica usando la API de Flickr. Lo que quiero lograr es ordenar mis imágenes por etiqueta. Lo que estoy usando es jQuery.getJSON() para poder analizar la respuesta de API de flickr.photosets.getPhotos.¿Es posible crear una matriz multidimensional vacía en javascript/jquery?

Los datos que estoy interesado en obtener de Flickr son la etiqueta y la URL asociada a cada foto. El problema con esto es que la única manera lógica de esto para mí es la creación de una matriz multidimensional con el siguiente formato:

Array['tag1'] => ['URL_1', 'URL_2', 'URL_3', 'URL_n']; 

Sin embargo, no puedo encontrar ninguna manera de lograr esto. Mi código es el siguiente:

$.getJSON('http://api.flickr.com/services/rest/?api_key=xxx&method=flickr.photosets.getPhotos&user_id=xxx&format=json&extras=tags%2C+url_l%2C+url_sq&nojsoncallback=1&photoset_id=xxx', 
    function(data) { 

    var imageArray = []; 
    $.each(data.photoset.photo, function(i, item) { 

     imageArray[item.tags] = [item.url_sq,]; 

    }); 
}); 

Soy consciente de que el código podría ser incómoda, pero yo he intentado todo y no hay manera de que pueda resolver esto.

+0

¿Puede mostrarnos la respuesta y cómo se ve? Eso ayudará significativamente. –

+0

Esa es la respuesta: http://pastebin.com/S5g2zwwD – finferflu

Respuesta

14
var arr = []; 
arr[0] = []; 
arr[0][0] = []; 
arr[0][0][0] = "3 dimentional array" 

Las matrices multidimensionales tienen muchas lagunas, a menos que se utilicen correctamente. Una matriz bidimensional se llama matriz.

Creo que sus datos contienen una cadena separada de espacio llamada "etiquetas" que contienen las etiquetas y una url única.

var tagObject = {}; 
data.photoset.photo.forEach(function(val) { 
    val.tags.split(" ").forEach(function(tag) { 
    if (!tagObject[tag]) { 
     tagObject[tag] = []; 
    } 
    tagObject[tag].push(val.url_sq); 
    }); 
}); 
console.log(tagObject); 
/* 
    { 
    "sea": ["url1", "url2", ...], 
    "things": ["url4", ...], 
    ... 
    } 
*/ 

No sé cómo devuelve varias etiquetas.

+0

Mi problema con esto es que no puedo especificar explícitamente el índice de la matriz. Solo puedo usar las variables proporcionadas por el bucle 'each()'. Tendría que declarar que la matriz es multidimensional fuera del ciclo, cuando aún no se le ha asignado nada. Espero que tenga sentido ... – finferflu

+0

@finferflu solo debes especificar un objeto y crear valores que sean matrices. A continuación, inserte la url de la imagen en la matriz. – Raynos

+0

¡Eso es todo! Muchas gracias :) Mi respuesta fue dirigida a tu comentario original, es por eso que no tiene mucho sentido en relación con tu última edición. – finferflu

1

Creo que la sintaxis que está tratando de lograr es algo como lo siguiente:

var item = {"tags":"blah","url_sq":"example.com"}; // for sake of example. 
var imageArray = []; 
$.each(data.photoset.photo, function(i, item) { 
    imageArray.push({"tags":item.tags,"url":item.url_sq}); 
}); 

y luego hacer referencia a ella como esto:

imageArray[0].tags 
imageArray[0].url 
imageArray[1].tags 
imageArray[1].url 
... 
1

JavaScript no tiene verdaderas matrices multidimensionales (diablos , ni siquiera tiene matrices regulares verdaderas ...), pero, al igual que la mayoría de los lenguajes, en su lugar utiliza matrices de matrices. Sin embargo, para mí parece que necesitas un objeto (algo similar a las matrices de PHP) que contiene matrices.

var data = { 
    tag1: ['URL_1', 'URL_2', 'URL_3', 'URL_n'] 
}; 
// Then accessed like: 
data.tag1; // ['URL_1', ...] 
data.tag1[0]; // 'URL_1' 
data.tag1[1]; // 'URL_2' 
// etc. 

Por lo tanto, usted es problema sería algo como esto:

var tags = {}; 
$.each(data.photoset.photo, function (i, item) { 
    $.each(item.tags.split(" "), function (i, tag) { 
     if (!tags[tag]) 
      tags[tag] = []; 
     tags[tag].push(item.url_sq); 
    }); 
}); 
// tags is now something like: 
// { 
    "foo": ["/url.html", "/other-url/", ...], 
    "bar": ["/yes-im-a-lisp-programmer-and-thats-why-i-hypenate-things-that-others-might-underscore-or-camelcase/", ...], 
    ... 
//} 
+0

Realmente no ayuda a resolver el problema – Raynos

+0

@Raynos: Bueno, básicamente es lo que haces en tu ejemplo. Le robé tu ejemplo para ayudar a demostrar. : P –

1

Tal vez algo así en tu each:

if (imageArray[item.tags] != null){ 
    imageArray[item.tags][imageArray[item.tags].length] = item.url_sq; 
}else{ 
    imageArray[item.tags] = []; 
} 
0

creo que algo como esto debería hacer lo que quiere

var imageArray = []; 

$.each(data.photoset.photo, function(i, item) { 

    // if the tag is new, then create an array 
    if(!imageArray[item.tags]) 
    imageArray[item.tags] = []; 

    // push the item url onto the tag 
    imageArray[item.tags].push(item.url_sq); 

}); 
+0

¿Por qué molestarse con un cheque 'indefinido'. Es una matriz o indefinido. Un simple '! ImageArray [item.tags]' hará – Raynos

1

¡Sí lo es! Encontré esto bastante rápido. Podría estirarme para decir que podría ser la forma más rápida posible de generar una matriz N dimensional de longitudes Ns que resulte en matrices vacías usando JavaScript. (es decir, un número arbitrario de dimensiones, cada una con una longitud arbitraria)

Aunque la definición de una matriz en JavaScript es nebulosa en el mejor de los casos.

function createNDimArray(dimensions) { 
    var t, i = 0, s = dimensions[0], arr = new Array(s); 
    if (dimensions.length < 3) for (t = dimensions[1] ; i < s ;) arr[i++] = new Array(t); 
    else for (t = dimensions.slice(1) ; i < s ;) arr[i++] = createNDimArray(t); 
    return arr; 
} 

Usos:

var arr = createNDimArray([3, 2, 3]); 
// arr = [[[,,],[,,]],[[,,],[,,]],[[,,],[,,]]] 
console.log(arr[2][1]); // in FF: Array [ <3 empty slots> ] 
console.log("Falsy = " + (arr[2][1][0]?true:false)); // Falsy = false 

si es que quiere leer más; mira mi answer a este question.

Cuestiones relacionadas