gpt4 book ai didi

javascript - 如何在 Node.js 中高效/快速地执行类似于 MongoDB $lookup 的数组连接?

转载 作者:可可西里 更新时间:2023-11-01 09:25:32 26 4
gpt4 key购买 nike

我想在 Node.js 中执行 $lookup,类似于从 MongoDB 执行 $lookup 聚合。

我有一个解决方案,但我不确定它在两个数组中的每个数组中的更多对象或更大的对象的执行速度有多快。

let users = [
{userId: 1, name: 'Mike'},
{userId: 2, name: 'John'}
]
let comments = [
{userId: 1, text: 'Hello'},
{userId: 1, text: 'Hi'},
{userId: 2, text: 'Hello'}
]

let commentsUsers = [
{userId: 1, text: 'Hello', user: {userId: 1, name: 'Mike'}},
{userId: 1, text: 'Hi', user: {userId: 1, name: 'Mike'}},
{userId: 2, text: 'Hello', user: {userId: 2, name: 'John'}}
] //Desired result

我知道这可以使用 ECMA6 数组轻松完成。例如:

let commentsUsers = comments.map(comment => {comment, users.find(user => user.userId === comment.userId)} )

我认为这是对大量用户执行此操作的有效方法,例如。 100 万用户。 lodash 与这个或任何其他更专业的库相比如何?有没有更好的方法可以用 Vanilla JS 来做到这一点,例如。使用 Array.prototype.reduce()?能否以任何方式使用索引来提高连接的性能?

编辑:

我的理想方案

let users    = [{userId:1,name:'Mike'},{userId:2,name:'John'}]
let comments = [{userId:1,text:'Hello'},{userId:1,text:'Hi'},{userId:2,text:'Hello'}];

let usersMap = new Map(users.map(user => [user.userId, user]))
let commentsUsers = comments.map(comment => ({...comment, user: usersMap.get(comment.userId)}))

console.log(commentsUsers)

感谢反馈!

最佳答案

您想要的结果不是正确的数据结构。你错过了你的对象的关键,例如{userId: 1, name: 'Mike'}。我添加了 user 作为索引解决方案的键值。

首先,我创建了一个 Map,其中 userId 将是我们的循环值。之后,我只是用 map 遍历 comments,将每个对象转换为一个新对象,其中包含所有 comment 信息以及一对新的 k-v用户。对于那对,我们不再需要使用 find 而是我们有一个简单的 HashMap get 调用。

在时间复杂度方面,这会将代码从 O(n^2) 更改为 O(n)

let users    = [{userId:1,name:'Mike'},{userId:2,name:'John'}], 
comments = [{userId:1,text:'Hello'},{userId:1,text:'Hi'},{userId:2,text:'Hello'}];

function mergeCommentUser(users, comments) {
let map = new Map(users.map(v => [v.userId, v]));
return comments.map(o => ({...o, user: map.get(o.userId)}));
}

console.log(JSON.stringify(mergeCommentUser(users,comments)))

根据您的需要(并节省冗余),您还可以更改以下行:

let map = new Map(users.map(v => [v.userId, v]));

改为:

let map = new Map(users.map(v => [v.userId, v.name]));

你的结果应该是这样的:

[
{"userId":1,"text":"Hello","user":"Mike"},
{"userId":1,"text":"Hi","user":"Mike"},
{"userId":2,"text":"Hello","user":"Paul"}
]

否则,您可以省略 comment.userId,而是将完整的用户添加到对象中,以另一种方式避免冗余。

关于javascript - 如何在 Node.js 中高效/快速地执行类似于 MongoDB $lookup 的数组连接?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57492859/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com