2011-09-17 15 views
5

Say mam ten obiekt JSON:Uzyskaj obiekt JSON przez atrybut

var images = {"success":"true", "images":[ 
    {"id":"1234","url":"asdf","tags":["cookie","chocolate"]}, 
    {"id":"5678","url":"qwer","tags":["pie","pumpkin"]} 
]}; 

Jaki byłby najbardziej skuteczny sposób, aby uzyskać adres URL obrazu o identyfikatorze 5678? Może używać jQuery.

+0

Ile masz? Jeśli jest ich tylko kilka (na przykład mniej niż 500), to nie ma znaczenia, jakie podejście podejmiesz. – tjameson

+0

Prawdopodobnie będzie ich kilkaset, ale w niektórych przypadkach może być ich maksymalnie 1000. – penguinrob

+0

Czy możesz pokazać mi jedno z tych podejść? To naprawdę nie ma znaczenia, jak wydajna, potrzebuję czegoś, co wykona zadanie. – penguinrob

Odpowiedz

12

Ponieważ jest to tablica i szukasz właściwości osadzonej, a nie tylko prostej wartości tablicowej, nie można jej znaleźć w super skuteczny sposób. Mechanizm brutalnej siły przechodzi przez tablicę i porównuje każdy identyfikator z tym, czego szukasz.

Jeśli zamierzasz wielokrotnie przeglądać tego typu dane w tej samej strukturze danych i chcesz je przyspieszyć, możesz przekonwertować istniejącą strukturę danych na inną strukturę danych, która jest bardziej wydajna w uzyskiwaniu dostępu. przez ID jak ten:

var imagesById = { 
    "1234": {"url":"asdf","tags":["cookie","chocolate"]}, 
    "5678": {"url":"qwer","tags":["pie","pumpkin"]} 
} 

Następnie znalezienie obiektu przez ID jest tak proste, jak to:

imagesById["1234"] 
+0

Ah, +1 za wprowadzenie do innej struktury danych. Po prostu zrobię to, gdy najpierw otrzymam JSON, aby przyspieszyć dostęp. – penguinrob

2

ile identyfikatory są klasyfikowane, nie można zrobić lepiej niż zwykły stary iteracji:

var images = {"success":"true", "images":[ 
    {"id":"1234","url":"asdf","tags":["cookie","chocolate"]}, 
    {"id":"5678","url":"qwer","tags":["pie","pumpkin"]} 
]}; 

var inner = images.images, 
    targetId = '5678', 
    found = null; 

for (var i=0; i<inner.length; i++) { 
    if (inner[i][id] === targetId) { 
     found = inner[i]; 
     // do stuff... 
     break; 
    } 
} 
2

Trzeba pętli tablicy:

$.each(images.images,function(i,img) { 
    if(img.url == "5678") { 
     //do whatever you want with this url 
    } 
} 
5
url = $.grep(images.images, function(item) { return item.id === '5678' })[0].url; 
+0

Nie słyszałem o funkcji grep wcześniej w jQuery! +1 za to! – penguinrob