Javascript 按StudentId对数组进行分组,并找到具有相同元素的子数组的和

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

这是一个批次的考勤记录。 我试图将这个数组转换为以下形式

具有特定StudentId的所有记录必须与一个StudentId和studentname一起

 [
    {
        "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);