2011-09-17 50 views
5

Nói rằng tôi có đối tượng JSON này:Nhận đối tượng JSON bởi thuộc tính

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

Điều gì sẽ là cách hiệu quả nhất để có được url của hình ảnh với một id của 5678? Có thể sử dụng jQuery.

+0

Có bao nhiêu bạn có? Nếu nó chỉ là một vài (như ít hơn 500), sau đó nó không quan trọng cách tiếp cận bạn có. – tjameson

+0

Có thể sẽ có vài trăm, nhưng trong một số trường hợp có thể có tối đa là 1.000. – penguinrob

+0

Bạn có thể chỉ cho tôi một trong những cách tiếp cận đó không? Nó không thực sự quan trọng như thế nào là hiệu quả, tôi chỉ cần một cái gì đó mà được công việc làm. – penguinrob

Trả lời

12

Vì đó là một mảng và bạn đang tìm kiếm một thuộc tính được nhúng, không chỉ là một giá trị mảng đơn giản, nên thực sự không phải là một cách siêu hiệu quả để tìm nó. Có cơ chế bạo lực chỉ cần đi qua mảng và so sánh từng id với những gì bạn đang tìm kiếm.

Nếu bạn đang tìm kiếm những thứ này trong cùng một cấu trúc dữ liệu nhiều lần và bạn muốn tăng tốc, thì bạn có thể chuyển cấu trúc dữ liệu hiện có thành cấu trúc dữ liệu khác hiệu quả hơn để truy cập bởi ID như thế này:

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

Sau đó, việc tìm kiếm một đối tượng bằng cách id cũng đơn giản như thế này:

imagesById["1234"] 
+0

Ah, +1 để đưa vào cấu trúc dữ liệu khác. Tôi sẽ chỉ làm điều đó một khi nó lần đầu tiên nhận được JSON, để tăng tốc độ truy cập. – penguinrob

2

Trừ khi các ID đều được sắp xếp, bạn không thể làm tốt hơn so với lần lặp cũ đồng bằng:

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

Bạn sẽ phải lặp qua mảng:

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

Tôi chưa từng nghe về hàm grep trước đây trong jQuery! +1 cho điều đó! – penguinrob

Các vấn đề liên quan