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

向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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:18:37