2011-09-17 16 views
5

Decir que tengo este objeto JSON:objeto JSON por atributos

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

¿Cuál sería la forma más eficiente para obtener la url de la imagen con un id de 5678? Puede usar jQuery.

+0

¿Cuántos tiene? Si solo son unos pocos (como menos de 500), entonces no importa qué enfoque tome. – tjameson

+0

Probablemente habrá varios cientos, pero en algunos casos podría haber un máximo de 1,000. – penguinrob

+0

¿Podría mostrarme alguno de esos enfoques? Realmente no importa cuán eficiente es, solo necesito algo que haga el trabajo. – penguinrob

Respuesta

12

Como se trata de una matriz y está buscando una propiedad incrustada, no solo un valor de matriz simple, no existe realmente una forma super eficiente de encontrarla. Existe el mecanismo de fuerza bruta de caminar por la matriz y comparar cada identificación con lo que estás buscando.

Si va a buscar este tipo de cosas en esta misma estructura de datos varias veces y desea acelerarlo, puede convertir la estructura de datos existente en una estructura de datos diferente que sea más eficiente para acceder por ID de la siguiente manera:

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

Entonces, la búsqueda de un objeto mediante la identificación es tan simple como esto:

imagesById["1234"] 
+0

Ah, +1 para poner en otra estructura de datos. Lo haré una vez que obtenga el JSON, para acelerar el acceso. – penguinrob

2

a menos que los identificadores están ordenados, no se puede hacer nada mejor que viejo iteración sencilla:

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

Habría que recorrer la matriz:

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

No he oído hablar antes de la función grep en jQuery! +1 por eso! – penguinrob

Cuestiones relacionadas