2011-09-17 167 views
5

說我有此JSON對象:通過屬性獲取JSON對象

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

什麼是最有效的方式與5678的ID來獲得圖像的網址是什麼?可以使用jQuery。

+0

多少,你呢?如果只有少數人(比如少於500人),那麼使用什麼方法並不重要。 – tjameson

+0

可能會有幾百個,但在某些情況下可能會有最多1,000個。 – penguinrob

+0

你能告訴我任何一種方法嗎?它的效率並不重要,我只需要一些能夠完成工作的東西。 – penguinrob

回答

12

因爲它是一個數組,你正在尋找一個嵌入式屬性,而不僅僅是一個簡單的數組值,所以找不到它是一種超高效的方法。有剛剛走過陣列的蠻力機制,並將每個ID與您正在查找的內容進行比較。

如果您要在同一數據結構中多次查找這些類型的東西,並希望加快速度,那麼您可以將現有的數據結構轉換爲更有效的訪問數據結構通過這樣的ID:

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

然後,通過找到ID爲對象是如此簡單:

imagesById["1234"] 
+0

啊,把它放到另一個數據結構中+1。一旦它首次獲得JSON,我就會這樣做,以加速進一步的訪問。 – penguinrob

2

除非ID進行分類,你不能這樣做比普通的舊迭代更好:

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

你會從陣列必須循環:

$.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

我在jQuery中沒有聽說過grep函數! +1! – penguinrob