Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/404.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何按子对象对对象数组进行分组?_Javascript_Arrays_Typescript_Grouping - Fatal编程技术网

Javascript 如何按子对象对对象数组进行分组?

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

我正在为web应用程序的后端使用TypeScript,我发现交集类型对于生成高效的SQL查询非常有用。基本上,如果我有以下表格:

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));