You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:03:28