正在搜索复杂的JSON数据以查找匹配的键值

Searching complex JSON data for matching key value

本文关键字:查找 键值 JSON 搜索 复杂 数据      更新时间:2023-09-26

我很难理解这个问题。我搜索了一些类似问题的答案,但所有示例中的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 URL。

正如我所说,我已经找到了可能的解决方案,但示例数据只有1-2个级别。我无法完全理解这种特定场景所需的循环。

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;
        }
    }
}
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使它比传统的循环更具可读性。every方法允许您通过返回false来中断循环,这样您就不必遍历整个列表,除非在数组中的最后一个元素上匹配。