平均值(nodeJs)

Average value (nodeJs)

我有一个如下所示的猫鼬模式:

const ratesSchema = new Schema({
 voter: {
    type: Schema.Types.ObjectId, ref: 'User' 
  },
  project: {
    type: Schema.Types.ObjectId, ref: 'Project' 
  },
  votes:{
    participant:{
      type: Schema.Types.ObjectId, ref: 'User'
    },
    criteria1: Number, 
    criteria2: Number, 
    criteria3: Number, 
    criteria4: Number, 
    criteria5: Number, 
    criteria6: Number, 
    criteria7: Number, 
    criteria8: Number, 
    criteria9: Number, 
    criteria10: Number,
    criteria11: Number, 
    criteria12:String,
    average:  Number
  }
})

在表达中,我试图根据前 10 个标准和第 11 个标准的平均比率计算每个参与者的平均值:

const avg = (args) => args.reduce((a, b) => a + b) / args.length;

router.post('/:id/rate', isLogedIn, catchAsync(async(req, res, next) => {
  const{project, voter, participants, criteria1, criteria2, criteria3, criteria4, criteria5, criteria6, criteria7, criteria8,criteria9, criteria10, criteria11, criteria12} = req.body

  for(let i= 0; i < participants.length; i++){
    const rate = new Rates({
      project,
      voter,
      votes:{
        participant: participants[i],
        criteria1: criteria1[i],
        criteria2: criteria2[i],
        criteria3: criteria3[i],
        criteria4: criteria4[i],
        criteria5: criteria5[i],
        criteria6: criteria6[i],
        criteria7: criteria7[i],
        criteria8: criteria8[i],
        criteria9: criteria9[i],
        criteria10: criteria10[i],
        criteria11: criteria11[i],
        criteria12: criteria12[i],
        average: avg([avg([criteria1[i], criteria2[i], criteria3[i], criteria4[i], criteria5[i], criteria6[i], criteria7[i], criteria8[i], criteria9[i], criteria10[i]]), criteria11[i]])
      }
    })
    console.log(rate.votes.average)
  }
    res.send('hi')
}));

问题是,如果所有标准都被评为 8,则它不会算作平均正确率 它将计算平均值为:4444444

谁能帮我解决这个问题(我是编程新手)

您应该将您的数据转换为 int 您正在添加 criteria1[i] 作为字符串而不是 int 你应该通过 parseInt() 将它转换为 int 有两种方法 1 :

const avg = (args) => args.reduce((a, b) => parseInt(a) + parseInt(b)) / args.length;

2 :

avg([avg([parseInt(criteria1[i])...), parseInt(criteria11[i]])) // do it for all criteria