Есть много способов сделать это.Самым простым, вероятно, является создание базового объекта, представляющего ваши пустые результаты.Затем переберите студентов и заполните массивы:
let students = [{name: 'John',score: 90,time: 'evening'},{name: 'Doni',score: 68,time: 'morning'},{name: 'Jiu',score: 50,time: 'evening'},{name: 'Shin',score: 92,time: 'morning'},];
// Empty case
let base = {
"evening": {"pass": [], "fail": []},
"morning": {"pass": [], "fail": []}
}
const PASSING = 70
students.forEach(({name, score, time}) => {
let key = score >= PASSING ? 'pass' : 'fail'
base[time][key].push({name, score})
})
console.log(base)
Это позволяет легко иметь пустые массивы, что, вероятно, то, что вы хотите, если нет учеников в определенной категории.
РЕДАКТИРОВАТЬ на основе комментариев:
Чтобы поддерживать произвольное время, вы можете просто создать время на объекте так, как вы его нашли.reduce()
хорошо для этого, но вы также можете использовать обычный цикл.Например, с добавленным afternoon
временем:
let students = [{name: 'Mark',score: 95,time: 'afternoon'}, {name: 'John',score: 90,time: 'evening'},{name: 'Doni',score: 68,time: 'morning'},{name: 'Jiu',score: 50,time: 'evening'},{name: 'Shin',score: 92,time: 'morning'},];
const PASSING = 70
let result = students.reduce((obj, {name, score, time}) => {
if (!obj[time]) obj[time] = {'pass': [], 'fail': [] }
let key = score >= PASSING ? 'pass' : 'fail'
obj[time][key].push({name, score})
return obj
}, {})
console.log(result)