2011-09-22 20 views
9

Próbuję stworzyć bardzo podstawową galerię Flickr za pomocą interfejsu API Flickr. To, co chcę osiągnąć, to sortowanie moich zdjęć według tagów. Używam jQuery.getJSON(), dzięki czemu mogę analizować odpowiedź API z flickr.photosets.getPhotos.Czy można utworzyć pustą tablicę wielowymiarową w javascript/jquery?

Dane, które chcę pobrać z Flickr to tag i adres URL powiązane z każdym zdjęciem. Problemem jest to, że jedynym logicznym wyjściem z tego dla mnie jest stworzenie wielowymiarowej tablicy w następującym formacie:

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

Jednak nie mogę znaleźć żadnego sposobu, aby to osiągnąć. Mój kod wygląda następująco:

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

    }); 
}); 

Zdaję sobie sprawę, że kod może wyglądać niezręcznie, ale Próbowałem wszystkiego i nie ma sposobu, mogę dowiedzieć się tego.

+0

Czy możesz pokazać nam odpowiedź i jak to wygląda? To znacznie pomoże. –

+0

Oto odpowiedź: http://pastebin.com/S5g2zwwD – finferflu

Odpowiedz

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

Wiele macierzy wymiarowych ma wiele luk, chyba że są używane prawidłowo. Dwuwymiarowa tablica nazywana jest macierzą.

Wierzę, że twoje dane zawierają oddzielony spacją ciąg o nazwie "tagi" zawierający tagi i pojedynczy adres 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", ...], 
    ... 
    } 
*/ 

Nie wiem, w jaki sposób zwraca wiele tagów.

+0

Mój problem polega na tym, że nie mogę jawnie określić indeksu tablicy. Mogę używać tylko zmiennych dostarczonych przez pętlę 'each()'. Musiałbym zadeklarować, że tablica jest wielowymiarowa poza pętlą, kiedy nic jeszcze nie zostało do niej przypisane. Mam nadzieję, że ma to sens ... – finferflu

+0

@finferflu po prostu określasz obiekt i tworzysz wartości, które są tablicami. Następnie wciśnij URL obrazu do tablicy. – Raynos

+0

To wszystko! Wielkie dzięki :) Moja odpowiedź została skierowana na Twój oryginalny komentarz, dlatego nie ma większego sensu w odniesieniu do Twojej ostatniej edycji. – finferflu

1

myślę składnia próbujesz osiągnąć coś jak poniżej:

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

a następnie odwoływać się do niej tak:

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

JavaScript nie ma prawdziwych tablic wielowymiarowych (Heck , nie ma nawet prawdziwych regularnych tablic ...), ale, jak większość języków, zamiast tego używa tablic tablic. Jednak dla mnie wygląda na to, że potrzebujesz obiektu (trochę podobnego do tablic PHP) zawierającego tablice.

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. 

Więc jesteś problemem będzie wyglądać mniej więcej tak:

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

Naprawdę nie pomaga rozwiązać problemu – Raynos

+0

@Raynos: Cóż, to w zasadzie to, co robisz w swoim przykładzie. Ukradłem twój przykład, aby pomóc wykazać. : P –

1

Może coś takiego w swoim each:

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

Myślę, że coś jak to powinno zrobić to, czego chce

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

Po co zawracać sobie głowę sprawdzeniem "nieokreślonego". Jest to tablica lub niezdefiniowana. Zrobi to proste '! ImageArray [item.tags]' – Raynos

1

Tak, jest! Znalazłem to dość szybko. Mogę wyciągnąć stwierdzenie, że może to być najszybszy sposób na wygenerowanie tablicy N Dimensional o długości Ns, skutkującej pustymi tablicami przy użyciu JavaScript. (tj. dowolna liczba wymiarów, z których każda ma dowolną długość)

Mimo że definicja tablicy w JavaScript jest w najlepszym wypadku mglista.

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

Usages:

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 

Jeśli zależy Ci, aby dowiedzieć się więcej; sprawdź mój answer na ten question.