2011-09-22 16 views
9

Sto cercando di creare una galleria di Flickr molto semplice usando l'API di Flickr. Quello che voglio ottenere è ordinare le mie foto per tag. Quello che sto usando è jQuery.getJSON() in modo che io possa analizzare la risposta API di flickr.photosets.getPhotos.È possibile creare un array multidimensionale vuoto in javascript/jquery?

I dati che mi interessa ottenere da Flickr sono il tag e l'URL associato a ciascuna foto. Il problema di questo è che l'unico modo logico di questo per me è la creazione di un array multidimensionale con il seguente formato:

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

Tuttavia, non riesco a trovare un modo per raggiungere questo obiettivo. Il mio codice è simile al seguente:

$.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,]; 

    }); 
}); 

Sono consapevole del fatto che il codice potrebbe essere imbarazzante, ma ho provato di tutto e non c'è modo per calcolare questo fuori.

+0

Puoi mostrarci la risposta e che aspetto ha? Ciò ti aiuterà in modo significativo. –

+0

Questa è la risposta: http://pastebin.com/S5g2zwwD – finferflu

risposta

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

Gli array multidimensionali presentano molti spazi vuoti, a meno che non vengano utilizzati correttamente. Un array bidimensionale è chiamato matrice.

Credo che i tuoi dati contengano una stringa separata di spazio chiamata "tag" contenente i tag e un singolo url.

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", ...], 
    ... 
    } 
*/ 

Non so come restituisce più tag.

+0

Il mio problema con questo è che non riesco a specificare l'indice di array in modo esplicito. Posso solo usare le variabili fornite dal ciclo 'each()'. Dovrei dichiarare che l'array è multidimensionale al di fuori del ciclo, quando non è stato ancora assegnato a esso. Spero che abbia senso ... – finferflu

+0

@finferflu basta specificare un oggetto e creare valori che sono matrici. Quindi spingere l'URL dell'immagine nell'array. – Raynos

+0

Ecco fatto! Grazie mille :) La mia risposta è stata indirizzata al tuo commento originale, ecco perché non ha molto senso in relazione alla tua ultima modifica. – finferflu

1

Penso che la sintassi si sta tentando di realizzare è qualcosa di simile al seguente:

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}); 
}); 

e quindi fare riferimento in questo modo:

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

JavaScript non ha vere matrici multidimensionali (diamine , non ha nemmeno veri array regolari ...), ma, come la maggior parte delle lingue, utilizza invece array di array. Comunque, a me sembra che tu abbia bisogno di un oggetto (un po 'simile agli array di PHP) contenente array.

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. 

Così, sei problema sarebbe simile a questa:

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

Non aiuta davvero a risolvere il problema – Raynos

+0

@Raynos: Beh, in pratica è quello che fai nel tuo esempio. Ho rubato il tuo esempio per aiutare a dimostrare. : P –

1

Forse qualcosa di simile nella vostra each:

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

penso che qualcosa di simile dovrebbe fare quello che si voglio

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

Perché preoccuparsi di un controllo 'indefinito'. È un array o indefinito. Un semplice '! ImageArray [item.tags]' farà – Raynos

1

Sì, lo è! Ho trovato questo abbastanza veloce. Potrei allungare per dire che potrebbe essere il modo più veloce per generare un array N dimensionale di lunghezze Ns con conseguente array vuoti che usano JavaScript. (ovvero un numero arbitrario di dimensioni ciascuna con una lunghezza arbitraria)

Anche se la definizione di un array in JavaScript è nebbiosa al meglio.

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; 
} 

Usi:

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 

se vi interessa saperne di più; controlla il mio answer in questo question.

Problemi correlati