En este ejercicio creo 3 funciones. score() para generar un número aleatorio. generateStudents() para crear un objeto de lista. El objeto tiene el formato {student:'name',marks:{...}} como se define en generateStudents() . En la última función, creo obj y obj1 . obj es una lista (asigne un valor igual a la función 2) y obj1 tiene el formato {"subject":...,"student_score:{}} .
Asigno key:value en un bucle for para crear la propiedad "student_score" (también un objeto), pero cuando salgo del bucle for e obj1 , no incluye la parte que tengo asignada en el bucle for.
¿Cómo puedo asignar key:value para una propiedad (también un objeto) usando for loop?
var score = function getRandomMark(start, end, step) { var num = start var arr = [] arr.push(num) while (num <= (end - step)) { num += step arr.push(num) } var index = Math.floor(Math.random() * (arr.length)) return (arr[index]) } var generateStudents = function generateStudent(nameArr) { var studentArr = [] for (let i = 0; i < nameArr.length; i++) { var student = { "name": nameArr[i], "marks": { "literature": score(6, 10 , 0.5), "maths": score(6, 10 , 0.5), "chemistry": score(6, 10 , 0.5), "history": score(6, 10 , 0.5), "biology": score(6, 10 , 0.5) } } studentArr.push(student) } return studentArr } var markList = ["Chi", "Duc", "Huy"] var findStudentMinMax = function findStudentMinMax() { var obj = generateStudents(markList) console.log(typeof (obj)) var obj1 = {} var arr1 = [] const keys1 = Object.keys(obj[0]["marks"]) for (let i = 0; i < keys1.length; i++) { var name = obj[0]["name"] var markObj = obj[0]["marks"] obj1["subject"] = keys1[i] obj1["student_score"] = {} //get all subject for (let i = 0; i < obj1.length; i++) { obj1["student_score"][name] = markObj[obj1["subject"]] } console.log(obj1) arr1.push(obj1) } } findStudentMinMax()Hice algunos cambios en el código dentro findStudentMinMax .
obj cambiado para students , ya que hace que el código sea más fácil de entender.j en el bucle for interno ya que chocaba con el i que se usaba en el bucle externo.obj1.length students.length el ciclo interno, ya que creo que estamos tratando de recorrer a los estudiantes. var score = function getRandomMark(start, end, step) { var num = start var arr = [] arr.push(num) while (num <= (end - step)) { num += step arr.push(num) } var index = Math.floor(Math.random() * (arr.length)) return (arr[index]) } var generateStudents = function generateStudent(nameArr) { var studentArr = [] for (let i = 0; i < nameArr.length; i++) { var student = { "name": nameArr[i], "marks": { "literature": score(6, 10 , 0.5), "maths": score(6, 10 , 0.5), "chemistry": score(6, 10 , 0.5), "history": score(6, 10 , 0.5), "biology": score(6, 10 , 0.5) } } studentArr.push(student) } return studentArr } var markList = ["Chi", "Duc", "Huy"] var findStudentMinMax = function findStudentMinMax() { var students = generateStudents(markList) // changed name of obj to students to make things clearer // console.log(typeof (obj)) var obj1 = {} var arr1 = [] const keys1 = Object.keys(students[0]["marks"]) for (let i = 0; i < keys1.length; i++) { // var name = obj[0]["name"] // var markObj = students[0]["marks"] obj1["subject"] = keys1[i] obj1["student_score"] = {} //get all subject for (let j = 0; j < students.length; j++) { // j instead of i let name = students[j]["name"]; // getting name from students let markObj = students[j]["marks"] // getting markObj from students obj1["student_score"][name] = markObj[obj1["subject"]] } console.log(obj1) arr1.push(obj1) } } findStudentMinMax()Parece que i < obj1.length; siempre devuelve false . Por lo tanto, su ciclo for nunca se ejecuta. Nunca puede acceder a .length en un objeto, por lo que debe cambiar el bucle for a i < Object.keys(obj1).length . Todavía no estoy seguro de cuál quiere que sea su objeto de salida porque solo indicó que deseaba insertar el valor dentro del objeto. A continuación encontrará el fragmento de código ejecutable.
var score = function getRandomMark(start, end, step) { var num = start var arr = [] arr.push(num) while (num <= (end - step)) { num += step arr.push(num) } var index = Math.floor(Math.random() * (arr.length)) return (arr[index]) } var generateStudents = function generateStudent(nameArr) { var studentArr = [] for (let i = 0; i < nameArr.length; i++) { var student = { "name": nameArr[i], "marks": { "literature": score(6, 10 , 0.5), "maths": score(6, 10 , 0.5), "chemistry": score(6, 10 , 0.5), "history": score(6, 10 , 0.5), "biology": score(6, 10 , 0.5) } } studentArr.push(student) } return studentArr } var markList = ["Chi", "Duc", "Huy"] var findStudentMinMax = function findStudentMinMax() { var obj = generateStudents(markList) console.log(typeof (obj)) var obj1 = {} var arr1 = [] const keys1 = Object.keys(obj[0]["marks"]) for (let i = 0; i < keys1.length; i++) { var name = obj[0]["name"] var markObj = obj[0]["marks"] obj1["subject"] = keys1[i] obj1["student_score"] = {} //get all subject for (let i = 0; i < Object.keys(obj1).length; i++) { obj1["student_score"][name] = markObj[obj1["subject"]] } console.log(obj1) arr1.push(obj1) } } findStudentMinMax()