Javascript 按StudentId对数组进行分组,并找到具有相同元素的子数组的和
这是一个批次的考勤记录。 我试图将这个数组转换为以下形式 具有特定StudentId的所有记录必须与一个StudentId和studentname一起Javascript 按StudentId对数组进行分组,并找到具有相同元素的子数组的和,javascript,arrays,json,Javascript,Arrays,Json,这是一个批次的考勤记录。 我试图将这个数组转换为以下形式 具有特定StudentId的所有记录必须与一个StudentId和studentname一起 [ { "id": 1, "subject": "FUNDAMENTALS OF INFORMATION TECHNOLOGY", "present": "false", "date": "2018-03-04", "createdAt": "2018-03
[
{
"id": 1,
"subject": "FUNDAMENTALS OF INFORMATION TECHNOLOGY",
"present": "false",
"date": "2018-03-04",
"createdAt": "2018-03-04T14:06:18.000Z",
"updatedAt": "2018-03-04T14:06:18.000Z",
"SemesterId": 1,
"BatchId": 1,
"StudentId": 1,
"Student": {
"id": 1,
"rollnumber": 11111,
"studentname": "LAWANNA HAUGHT",
"dateofbirth": "1997-1-01",
"mobilenumber": "9875449112",
"createdAt": "2018-03-03T14:59:01.000Z",
"updatedAt": "2018-03-03T14:59:01.000Z",
"BatchId": 1
}
},
{
"id": 7,
"subject": "COMPUTER ORGANIZATION",
"present": "true",
"date": "2018-03-04",
"createdAt": "2018-03-04T14:09:12.000Z",
"updatedAt": "2018-03-04T14:09:12.000Z",
"SemesterId": 1,
"BatchId": 1,
"StudentId": 1,
"Student": {
"id": 1,
"rollnumber": 11111,
"studentname": "LAWANNA HAUGHT",
"dateofbirth": "1997-1-01",
"mobilenumber": "9875449112",
"createdAt": "2018-03-03T14:59:01.000Z",
"updatedAt": "2018-03-03T14:59:01.000Z",
"BatchId": 1
}
},
{
"id": 2,
"subject": "FUNDAMENTALS OF INFORMATION TECHNOLOGY",
"present": "true",
"date": "2018-03-04",
"createdAt": "2018-03-04T14:06:18.000Z",
"updatedAt": "2018-03-04T14:06:18.000Z",
"SemesterId": 1,
"BatchId": 1,
"StudentId": 2,
"Student": {
"id": 2,
"rollnumber": 11112,
"studentname": "KAILA HALBROOK",
"dateofbirth": "1997-1-01",
"mobilenumber": "9875449113",
"createdAt": "2018-03-03T14:59:01.000Z",
"updatedAt": "2018-03-03T14:59:01.000Z",
"BatchId": 1
}
},
{
"id": 8,
"subject": "COMPUTER ORGANIZATION",
"present": "false",
"date": "2018-03-04",
"createdAt": "2018-03-04T14:09:12.000Z",
"updatedAt": "2018-03-04T14:09:12.000Z",
"SemesterId": 1,
"BatchId": 1,
"StudentId": 2,
"Student": {
"id": 2,
"rollnumber": 11112,
"studentname": "KAILA HALBROOK",
"dateofbirth": "1997-1-01",
"mobilenumber": "9875449113",
"createdAt": "2018-03-03T14:59:01.000Z",
"updatedAt": "2018-03-03T14:59:01.000Z",
"BatchId": 1
}
}
]
present是具有相同StudentId和subjectname且present=true的行数
缺少的是具有相同StudentId和subjectname且present=false的行数
total是具有相同StudentId和subjectname的行数
这是我在一个StackOverflow答案的帮助下使用下划线.js编写的代码。
但它发现了所有事物的存在、缺失和全部价值,而不是学生和主体
[
{
"StudentId": 1,
"studentname": "LAWANNA HAUGHT",
"rollnumber": 11111,
"attendance": [
{
"subject": "FUNDAMENTALS OF INFORMATION TECHNOLOGY",
"present": 0,
"absent": 1,
"total": 1
},
{
"subject": "COMPUTER ORGANIZATION",
"present": 1,
"absent": 0,
"total": 1
}
]
},
{
"StudentId": 2,
"studentname": "KAILA HALBROOK",
"rollnumber": 11111,
"attendance": [
{
"subject": "FUNDAMENTALS OF INFORMATION TECHNOLOGY",
"present": 1,
"absent": 0,
"total": 1
},
{
"subject": "COMPUTER ORGANIZATION",
"present": 0,
"absent": 1,
"total": 1
}
]
}
]
好吧,这有点奇怪。如果您正在对后端进行编码,那么在查询端处理这个问题可能是有意义的。也就是说,可以使用reduce将数组“折叠”为基于StudentId的对象。在此过程中,您可以构建记录的形状。我不认为这是使用reduce的标准方法,因为您正在转换数组。话虽如此,我想不出一个简单的使用地图的方法。此操作的结果为我们提供了一个对象,我们可以使用object.values()将其返回到数组。我不理解当前、缺席和总计的用例 这是你的电话号码
您可以使用嵌套方法查找strunden,然后再查找考勤
var data=[{id:1,主题:“信息技术基础”,当前:“假”,日期:“2018-03-04”,创建日期:“2018-03-04T14:06:18.000Z”,更新日期:“2018-03-04T14:06:18.000Z”,SemesterId:1,BatchId:1,学生id:1,学号:11111,学生姓名:“LAWANNA Haugh”,出生日期:“1997-1-01”,手机号码:“9875449112”,创建日期:“2018-03-03T14:59:01.000Z”,更新日期:“2018-03-03T14:59:01.000Z”,批次id:1},{id:7,主题:“计算机组织”,当前:“正确”,日期:“2018-03-04-04”,创建日期:“2018-03-04T14:09:12.000Z”,更新日期:“2018-03-04T14:09:12.000Z”,SemesterId:1,批次id:1,学生id:1,学生:{id:1,学号:11111,学生姓名:“LAWANNA Haugh”,出生日期:“1997-1-01”,手机号码:“9875449112”,创建日期:“2018-03-03T14:59:01.000Z”,更新日期:“2018-03-03T14:59:01.000Z”,批次id:1},{id:2,主题:“信息技术基础”,当前:“真实”,日期:“2018-03-04”,创建日期:“2018-03-04T14:06:18.000Z更新日期:“2018-03-04T14:06:18.000Z”,学期id:1,批次id:1,学生id:2,学生:{id:2,学号:11112,学生姓名:“KAILA HALBROOK”,出生日期:“1997-1-01”,手机号码:“9875449113”,创建日期:“2018-03-03T14:59:01.000Z”,更新日期:“2018-03-03T14:59:01.000Z”,批次id:1},主题:“计算机组织”更新日期:2018-03-04T14:09:12.000Z更新日期:2018-03-04T14:09:12.000Z更新日期:2018-03-04T14:09:12.000Z更新日期:2018-03-04T14:09:12.000Z更新日期:2018-03-03T14:59:01.000Z“2018-03-03T14:59:01.000Z”,批次ID:1}}],
分组=[];
data.forEach({subject,present,StudentId,Student:{rollnumber,studentname}})=>{
var student=grouped.find(g=>StudentId==g.StudentId),
出席;
如果(!学生){
学生={StudentId,studentname,rollnumber,出勤率:[]};
分组。推(学生);
}
出勤率=学生.出勤率.find(a=>a.subject==科目);
如果(!出席){
出席人数={受试者,出席人数:0,缺席人数:0,总数:0};
学生.出勤.推送(出勤);
}
出席人数[{true:'出席',false:'缺席'}[出席]]++;
出勤率.total++;
});
console.log(分组);
.as控制台包装{max height:100%!important;top:0;}
格式化您的代码!使用类似的工具或其他工具格式化此代码。阅读起来非常困难。对此表示抱歉。这是我的第一个问题。我不太了解格式化的工作原理。现在已修复。请添加您尝试过的内容和不起作用的内容。Attention.create({subject:req.body.subject,BatchId:req.body.batch_id,StudentId:req.body.student_id,semestId:req.body.semerm_id,present:req.body.present,date:datenow})这是我的insert查询。如果一个学生参加了课程,他就出席了。如果没有,他就缺席了。total是这两个词的总和,即已经上了多少课。如果查看查询,它会保存studentId、batchId、semesterId、date和present。present是布尔值。如果为true,则表示该学生参加了该课程。如果为false,则表示student没有参加课程。我希望你现在就可以了。谢谢你提供的额外信息。我更新了上面的JSFIDLE和代码片段,以包括现在和不存在。仍在考虑总数。犯了一个错误,请稍候。好的,用你的数据集试试。
var groups = _.groupBy(list, 'StudentId');
var result = _.map(groups, function(student){
return {
StudentId: student[0].StudentId,
studentname: student[0].Student.studentname,
rollnumber: student[0].Student.rollnumber,
attendances: _.map(student, function(item){
return {
subject:item.subject,
present: _.reduce(item, function(memo, att){
if(att.present=='true')
return memo + 1;
else
return memo;
}, 0),
absent: _.reduce(item, function(memo, att){
if(att.present=='false')
return memo + 1;
else
return memo;
}, 0),
total: _.reduce(item, function(memo, att){
return memo + 1;
}, 0)
}
})
})
}
}
);
function isolateRecords(data) {
return Object.values(data.reduce((accum, current) => {
let attenance = {
subject: current.subject,
present: current.present === "true" ? 1 : 0,
absent: current.present === "false" ? 1 : 0,
total: 0
};
attenance.total = attenance.present + attenance.absent;
if (accum[current.StudentId]) {
accum[current.StudentId].attendance.push(attenance);
} else {
accum[current.StudentId] = {
StudentId: current.StudentId,
studentname: current.Student.studentname,
rollnumber: current.Student.rollnumber,
attendance: [attenance]
}
}
return accum;
}, {}));
}
isolateRecords(myOriginalArrayOfRecords);