Javascript 如何按子对象对对象数组进行分组?
我正在为web应用程序的后端使用TypeScript,我发现交集类型对于生成高效的SQL查询非常有用。基本上,如果我有以下表格:Javascript 如何按子对象对对象数组进行分组?,javascript,arrays,typescript,grouping,Javascript,Arrays,Typescript,Grouping,我正在为web应用程序的后端使用TypeScript,我发现交集类型对于生成高效的SQL查询非常有用。基本上,如果我有以下表格: User userId: number userEmail: string Post postId: number userId: number (FK) postBody: string 我可以得到一个交叉点类型(User&Post),如下所示: { userId: number; userEmail: string; postId: numbe
User
userId: number
userEmail: string
Post
postId: number
userId: number (FK)
postBody: string
我可以得到一个交叉点类型(User&Post),如下所示:
{
userId: number;
userEmail: string;
postId: number;
postBody: string;
}
这意味着我可以使用这种类型来表示从联接的select查询中返回的行
问题是我必须在web服务器中分离数据。我必须编写迭代代码,为每个查询对它们进行分组,这可能会重复。以下是我试图实现的转型:
在:
输出:
我正在尝试使用一个函数来动态执行此操作,可能会传入集合、父键名称数组和子集合的名称。我最终得到了一个签名为以下的函数:函数组(coll:Array,parentkey:Array,childCollName:string):Array代码>
我想知道是否有人能帮我实现这个
到目前为止,我已经尝试使用Lodash。但是,它的groupBy
函数似乎无法判断子对象是否相等,在本例中,它仍然为我提供了一个包含三个对象的数组。试试下面的方法,循环创建对象怎么样
var arry=[
{
用户ID:1,
用户电子邮件:'user1@email.com',
职位:1,,
postBody:'用户1的第一篇帖子',
},
{
用户ID:1,
用户电子邮件:'user1@email.com',
职位:2,,
postBody:'用户1的第二篇帖子',
},
{
用户ID:2,
用户电子邮件:'user2@email.com',
职位:3,,
postBody:'用户2的第一篇帖子',
},
];
函数createPost(obj){
post={};
post.postId=obj.postId;
post.postBody=obj.postBody;
回程站;
}
函数转换(数组){
var-map={};
对于(var i=0;i您可以使用来实现目标。
var源=
[
{
用户ID:1,
用户电子邮件:'user1@email.com',
职位:1,,
postBody:'用户1的第一篇帖子',
},
{
用户ID:1,
用户电子邮件:'user1@email.com',
职位:2,,
postBody:'用户1的第二篇帖子',
},
{
用户ID:2,
用户电子邮件:'user2@email.com',
职位:3,,
postBody:'用户2的第一篇帖子',
},
]
var分组=源.reduce(函数(v,k){
如果(!v[k.userId]){
v[k.userId]={};
}
var group=v[k.userId];
group.userId=k.userId;
group.userEmail=k.userEmail;
如果(!group.posts){
组员额=[];
}
组.posts.push({postId:k.postId,
postBody:k.postBody})
返回v;
},{})
var dataArray=[];
用于(分组中的var o){
if(分组的hasOwnProperty(o)){
push(分组[o]);
}
}
log(JSON.stringify(dataArray,null,2))代码>这里是关于reduce、some和destructuring的另一个例子
[
{
userId: 1,
userEmail: 'user1@email.com',
postId: 1,
postBody: 'User 1\'s first post',
},
{
userId: 1,
userEmail: 'user1@email.com',
postId: 2,
postBody: 'User 1\'s second post',
},
{
userId: 2,
userEmail: 'user2@email.com',
postId: 3,
postBody: 'User 2\'s first post',
},
]
[
{
userId: 1,
userEmail: 'user1@email.com',
posts: [
{
postId: 1,
postBody: 'User 1\'s first post',
},
{
postId: 2,
postBody: 'User 1\'s second post',
}
],
},
{
userId: 2,
userEmail: 'User 2\'s email',
posts: [
{
postId: 3,
postBody: 'User 2\'s first post',
}
]
}
]
const grouped = [
{
userId: 1,
userEmail: 'user1@email.com',
postId: 1,
postBody: 'User 1\'s first post',
},
{
userId: 1,
userEmail: 'user1@email.com',
postId: 2,
postBody: 'User 1\'s second post',
},
{
userId: 2,
userEmail: 'user2@email.com',
postId: 3,
postBody: 'User 2\'s first post',
}
];
const sorted = grouped.reduce((acc, nxt) => {
const { userId, userEmail, ...rest } = nxt;
let index;
let user;
const accHasUser = acc.some((obj, i) => {
if (obj && obj.userId === userId) {
index = i;
return true;
}
return false;
});
if (!accHasUser) {
user = { userId, userEmail, posts: [rest] };
acc.push(user);
} else {
acc[index].posts.push(rest);
}
return acc;
}, []);
console.log(JSON.stringify(sorted));