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

JavaScript中如何为对象属性追加子属性,避免覆盖原有内容

问题解决:循环中为对象属性追加值而非覆盖

你的核心问题是每次循环都重置了xp_logs[todaysDate]对象,导致之前添加的用户数据被清空,最终只保留最后一条记录。

错误原因

代码中每次循环都执行xp_logs[todaysDate] = {},这会把当天的日志对象重新初始化为空,覆盖之前已添加的所有用户数据。此外循环条件i <= rows.length会导致最后一次循环访问rows[i]时出现undefined,应该改为i < rows.length。

修正后的代码

let xp_logs = {};
// 先初始化当天的日志对象(如果不存在的话)
if (!xp_logs[todaysDate]) {
    xp_logs[todaysDate] = {};
}

for (let i = 0; i < rows.length; i++) {
    const row = rows[i];
    const currentMember = member[i];
    if (row && currentMember) {
        // 检查当前成员是否为管理员
        if (currentMember.roles.cache.find(r => r.id === roles.admin)) {
            // 直接向当天的日志对象中添加新用户数据
            xp_logs[todaysDate][currentMember.displayName] = {
                id: currentMember.user.id,
                xp: row.xp
            };
            console.log(currentMember.displayName);
        }
    }
}

fs.writeFileSync("./xp_logs.json", "\n" + JSON.stringify(xp_logs, null, 2));

关键改动说明

  • 提前初始化日期对象:在循环外判断xp_logs[todaysDate]是否存在,不存在才创建空对象,避免每次循环重置。
  • 修正循环条件:将i <= rows.length改为i < rows.length,防止访问超出数组范围的undefined元素。
  • 缓存循环变量:把rows[i]和member[i]赋值给临时变量,提升代码可读性和性能。
  • 修正console.log的变量:原来的member.displayName改为currentMember.displayName,确保输出当前循环的成员名称。

最终效果

执行修正后的代码后,xp_logs.json会生成你期望的结构:

{
  "7/21/2022": {
    "Sierra": {
      "id": "123561241241241244",
      "xp": 190
    },
    "Cammy": {
      "id": "556574574574234234",
      "xp": 600
    },
    "Henry": {
      "id": "331231456712356126",
      "xp": 280
    }
  }
}

内容的提问来源于stack exchange,提问作者Balan Andrei

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.25 11:45:56