搜索复杂的JSON数据以匹配键值

时间:2014-04-29 21:35:06

标签: javascript json loops nested-loops

我无法解决这个问题。我搜索并找到了类似问题的几个答案,但所有示例中的JSON数据都太简单了。我的比较复杂。

我有一系列数字,我正在循环。对于每个循环,我需要将数字与我的JSON数据匹配以查找匹配的条目,然后从该条目获取特定的键值。

这是我的数组的一个例子:

results = [377, 375, 373, 353, 355]

这是我的JSON数据的一个例子:

{
    "count": 10,
    "posts": [
        {
            "title": "Title of Post",
            "attachments": [
                {
                    "id": 377,
                    "images": {
                        "full": {
                            "url": "http://example.com/images/foo.jpg",
                            "width": 800,
                            "height": 600
                        },
                        "thumbnail": {
                            "url": "http://example.com/images/foo_thumb.jpg",
                            "width": 150,
                            "height": 150
                        }
                    }
                },
                {
                    "id": 355,
                    "images": {
                        "full": {
                            "url": "http://example.com/images/bar.jpg",
                            "width": 800,
                            "height": 600
                        },
                        "thumbnail": {
                            "url": "http://example.com/images/bar_thumb.jpg",
                            "width": 150,
                            "height": 150
                        }
                    }
                }
            ]
        },
        // 9 more posts...
    ]
}

对于results中的每个号码,我需要将其与每个posts.attachments.id匹配。因此,在这种情况下,377355是匹配项。对于所有匹配的附件,我需要抓取其fullthumbnail网址。

就像我说的,我已经找到了可能的解决方案,但示例数据只有1-2级深度。我不能完全围绕这个特定场景所需的循环。

2 个答案:

答案 0 :(得分:1)

var urls = [];
var att = posts.attachments;
for (var i = 0; i < results.length; i++) {
    var id = results[i];
    for (var j = 0; j < att.length; j++) {
        if (att[j].id == id) {
            urls.push({
                id: id,
                full: att[j].images.full.url,
                thumbnail: att[j].images.thumbnail.url
            });
            break;
        }
    }
}

答案 1 :(得分:0)

var urls = [];
results.forEach(function(result){
    posts.forEach(function(post){
        post.attachments.every(function(attachment){
            if(result === attachment.id) {
                urls.push({
                    id: attachment.id,
                    full: attachment.images.full.url,
                    thumbnail: attachment.images.thumbnail.url
                });
                return false;
            }
            return true;
        });
    });
});

这里有很多嵌套的foreach循环,你应该始终保持最小, 但这一切都可以归结为您的数据有多大以及未来的数据。

forEach是一个原生的javascript函数,imo使它比传统的for循环更具可读性。 every方法允许您通过返回false来中断循环,因此除非匹配数组中的最后一个元素,否则不必遍历整个列表。