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
相关产品推荐
相关产品推荐

