NodeJS 如何有效地遍历json对象,然后根据输入进行过滤?

avkwfej4  于 2023-06-05  发布在  Node.js
关注(0)|答案(1)|浏览(185)

我在 MongoDB 数据库中有我的数据,下面是格式。我已经搜索了类似于Java中的流功能,但没有找到。
数据来自DB:

[
    {
        "eventList": [
            {
                "eventId": "1,2,3",
                "eventType": "1"
            },
            {
                "eventId": "4,5,6",
                "eventType": "2"
            }
        ]
    },
    {
        "eventList": [
            {
                "eventId": "7,8,9",
                "eventType": "3"
            }
        ]
    }
]

服务输入:

{
    "eventId": [
        "1",
        "2"
    ]
}

我们必须循环输入并匹配db列表中的eventId。JSON payload有60,000行。当我使用传统的for循环时,当我在输入中给予20个事件时,需要23秒。我可能犯了一些错误。也许有最好的办法来处理这件事。我有三个for循环,一个用于输入迭代,一个用于迭代事件列表,它是一个数组,最后一个循环用于比较,以检查eventId是否匹配。
希望我的陈述能涵盖
我的代码我试过了。

for (let i = 0; i < request.eventId.length; i++) {
    let eventId = request.eventId[i];
    for (let j = 0; j < response.length; j++) {
        for (let k = 0; k < response[j].eventList.length) {
            if (response[j].eventList[k].eventId.includes(eventId)) {
                console.log("matches");
            }
        }
    }
}
dy1byipe

dy1byipe1#

不确定这些“事件列表”中是否还有其他数据没有在这里显示,但对于手头的任务(从事件id查找事件类型),您可能希望选择更有效的查找结构。您绝对应该将eventIds存储在数组中,而不是字符串中(当事件ID包含在另一个ID中时,这也会导致错误匹配)。然后,您应该考虑使用适当的MongoDB查询来获取您正在寻找的事件类型,将输入id直接传递给数据库。
无论哪种方式,你也可以在JS中这样做,构建一个查找结构:

const eventTypeByEventId = new Map();
for (const {eventList} of response) {
    for (const {eventId, eventType} of eventListl) {
        for (const id of eventId.split(',')) {
            eventTypeByEventId.set(Number(id), eventType);
        }
    }
}

然后,在构建后,使用

for (const eventId of request.eventId) {
    const eventType = eventTypeByEventId.get(eventId);
    console.log(eventType
        ? `${eventId} matches ${eventType}`
        : `${eventId} does not match`
    );
}

如果您说eventTypeByEventId结构很少更改,您甚至可以在请求之间共享它。

相关问题