向JS对象指定索引添加键值对失败问题求助
问题分析与解决方案
你遇到的问题其实很常见——虽然e.vatRecord.debit在控制台打印是正常的,但你直接调用journalByAccounts[e.vatRecord.debit].push()时,这个键对应的数组根本还没被初始化,所以会抛出类似Cannot read properties of undefined (reading 'push')的错误。
原代码的问题点
你只初始化了一个空对象journalByAccounts = {},但当第一次遇到某个e.vatRecord.debit值时,journalByAccounts[e.vatRecord.debit]是undefined,而undefined没有push方法,自然就失效了。
修正后的代码
只需要在push之前,先检查该键对应的数组是否存在,不存在就先创建一个空数组:
journalByAccounts = {}; // 定义空对象 data.entries.forEach(function(e) { // 先确保目标键对应的数组存在,不存在则初始化 if (!journalByAccounts[e.vatRecord.debit]) { journalByAccounts[e.vatRecord.debit] = []; } // 再push数据 journalByAccounts[e.vatRecord.debit].push({ valuta: e.valuta, text: e.text, debit: e.mainRecord.amount }); });
更简洁的写法(可选)
可以用逻辑或运算符简化判断,一行完成初始化:
journalByAccounts = {}; data.entries.forEach(function(e) { const debitKey = e.vatRecord.debit; // 逻辑或:如果数组不存在就创建空数组,否则用已有数组 journalByAccounts[debitKey] = journalByAccounts[debitKey] || []; journalByAccounts[debitKey].push({ valuta: e.valuta, text: e.text, debit: e.mainRecord.amount }); });
额外提示
如果e.vatRecord.debit有可能是null、undefined或者空字符串这类无效键,建议先做个过滤,避免把这些值作为对象的键:
data.entries.forEach(function(e) { const debitKey = e.vatRecord.debit; // 过滤无效键 if (!debitKey) return; journalByAccounts[debitKey] = journalByAccounts[debitKey] || []; journalByAccounts[debitKey].push({ valuta: e.valuta, text: e.text, debit: e.mainRecord.amount }); });
内容的提问来源于stack exchange,提问作者FishWave
相关产品推荐
相关产品推荐

