JavaScript for循环为对象属性赋值后值丢失问题排查
问题根因
你的循环赋值没有生效,是几处逻辑错误共同导致的,和对象键值对赋值语法本身无关:
- 内层循环条件完全无效:你写的
for (let i = 0; i < obj1.length; i++)中,obj1是普通对象不是数组,没有length属性,obj1.length返回undefined,判断条件i < undefined永远为false,内层循环从未执行,赋值逻辑根本没有运行。 - 外层循环每次迭代都会执行
obj1["student_score"] = {},就算内层循环正常执行,之前存入的分数也会被每次重置为空对象,历史数据全部丢失。 - 全程复用同一个
obj1对象,push到数组时存的是对象引用,最终数组里所有项都会指向同一个对象,值全部是外层循环最后一次迭代的结果,无法保留每个科目的独立数据。 - 取值逻辑只取了
obj[0]即第一个学生的信息,没有遍历整个学生列表,无法收集所有学生对应科目的分数。
修复方案
核心调整点:
- 外层每次遍历科目时,新建独立的科目对象,不复用全局的
obj1,避免对象引用导致的数据覆盖问题 - 移除错误的内层循环,改为遍历整个学生列表,逐个给当前科目的
student_score属性添加「学生名:分数」键值对 student_score对象在每个科目对象初始化时创建一次即可,不需要在循环里反复重置
修复后可运行的完整代码:
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 studentList = generateStudents(markList) var result = [] const subjectList = Object.keys(studentList[0]["marks"]) // 遍历所有科目 for (let i = 0; i < subjectList.length; i++) { const currentSubject = subjectList[i] // 每个科目创建独立的存储对象 const subjectData = { "subject": currentSubject, "student_score": {} } // 遍历所有学生,填充当前科目的分数 for (let j = 0; j < studentList.length; j++) { const studentName = studentList[j]["name"] const score = studentList[j]["marks"][currentSubject] subjectData["student_score"][studentName] = score } result.push(subjectData) } console.log(result) return result } findStudentMinMax()
补充
JS中给对象动态添加键值对的标准写法就是targetObject[keyName] = value,这个语法本身没有问题,你遇到的问题完全是循环逻辑、对象引用、遍历范围写错导致的。
内容的提问来源于stack exchange,提问作者linhcheee
相关产品推荐
相关产品推荐

