通过属性获取JSON对象

5

假设我有这个JSON对象:

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

使用jQuery,获取id为5678的图片url最有效的方法是什么?

你有多少个?如果只有几个(比如少于500个),那么采取什么方法都无所谓。 - beatgammit
可能会有几百个,但在某些情况下可能最多达到1,000个。 - penguinrob
你能展示给我这些方法中的任何一种吗?效率如何并不重要,我只需要能完成任务的东西。 - penguinrob
4个回答

12

因为它是一个数组,而且你要查找的是内嵌属性,而不仅仅是一个简单的数组值,所以没有真正高效的方法来查找它。有一种蛮力机制,只需遍历整个数组,并将每个 id 与你要查找的内容进行比较。

如果你会在相同的数据结构中多次查找这些信息,并且想加快速度,那么可以将现有的数据结构转换为另一种更有效的按 ID 访问的数据结构,如下所示:

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

那么,通过id查找对象就像这样简单:

imagesById["1234"]

啊,把它放到另一个数据结构中加1。我会在第一次获取JSON时这样做,以加快后续访问速度。 - penguinrob

6
url = $.grep(images.images, function(item) { return item.id === '5678' })[0].url;

我以前从来没听说过jQuery里的grep函数!给你点赞! - 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
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接