#javascript #mongodb #average
Вопрос:
У меня есть схема мангуста, которая выглядит так:
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
}
})
и в express я пытаюсь рассчитать среднее значение для каждого участника на основе их средних показателей по первым 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
Может ли кто-нибудь помочь мне решить проблему (я новичок в программировании)
Комментарии:
1. Вам нужно передать 0 в качестве второго аргумента
reduce
вызова метода.
Ответ №1:
вы должны преобразовать свои данные в int
то, что вы добавляете критерии 1[i] как строку, а не int. вы должны преобразовать их в int, используя parseInt()
два способа 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
Комментарии:
1. Если мой ответ поможет вам, я буду признателен, если вы примете мой ответ:)