JavaScript数组push对象时被覆盖问题求助
问题解决思路
核心错误分析
filter条件里的赋值操作
你在filter(element => element.projectId = projectId)中用了赋值运算符=,而不是全等比较运算符===。每次调用这个方法时,会把数组里所有元素的projectId强制改成传入的projectId,赋值表达式返回的是修改后的值,所以filter会保留所有元素,取第一个就会得到被修改的元素,导致你误以为找到了匹配项,实际是把所有元素的id都改成了当前传入值,看起来数组被覆盖。初始数组的空对象干扰
你初始化openCalculationFiles = [{}],这个空对象没有projectId,每次执行filter时都会被赋值当前传入的projectId,导致它一直被误判为匹配项,新对象根本不会被push进去,反而每次都在修改这个空对象的lastUpdate,看起来数组只有这一个元素在更新。
修正后的代码
const cron = require('node-cron'); // 初始化为空数组,移除干扰的空对象 let openCalculationFiles = []; module.exports = { cronjobCalculationUsage: () => { cron.schedule('30,0 * * * * *', async() => { // 你的cron任务逻辑 }); }, upsertOpenCalculation: (projectId) => { console.log(openCalculationFiles); // 用===做全等比较,改用find直接获取匹配元素(比filter取[0]更高效) const openCalculation = openCalculationFiles.find(element => element.projectId === projectId); if (openCalculation) { openCalculation.lastUpdate = new Date().getTime(); } else { const newOpenCalculation = { projectId: projectId, lastUpdate: new Date().getTime() }; openCalculationFiles.push(newOpenCalculation); } console.log(openCalculationFiles); } };
内容的提问来源于stack exchange,提问作者Buzz
相关产品推荐
相关产品推荐

