Digamos que tengo este objeto JSON:

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 de obtener la URL de la imagen con un id de 5678? Puede usar jQuery.

5
penguinrob 17 sep. 2011 a las 07:16

4 respuestas

La mejor respuesta

Debido a que es una matriz y está buscando una propiedad incrustada, no solo un valor de matriz simple, en realidad no hay una forma súper eficiente de encontrarla. Existe el mecanismo de fuerza bruta de simplemente caminar a través de 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 mediante ID como esta :

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

Entonces, encontrar un objeto por id es tan simple como esto:

imagesById["1234"]
12
jfriend00 17 sep. 2011 a las 03:24

Tendría que recorrer la matriz:

$.each(images.images,function(i,img) {
   if(img.url == "5678") {
        //do whatever you want with this url
    }
}
2
Simeon G 17 sep. 2011 a las 03:31

A menos que las ID estén ordenadas, no puede hacerlo mejor que la iteración antigua simple:

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
Matt Ball 17 sep. 2011 a las 03:27
url = $.grep(images.images, function(item) { return item.id === '5678' })[0].url;
6
user123444555621 17 sep. 2011 a las 09:22