如何根据对象的特定属性值匹配更新另一个对象的对应数据
核心问题原因
- 引用共享问题:你给所有账户的
data属性都绑定了同一个blankDataArr数组。JS中数组属于引用类型,所有账户的data实际指向同一个内存地址,只要修改其中一个的数组值,所有账户的data都会同步变化,这是你所有账户数据都相同的核心原因。 - 初始化逻辑错误:
generatedObj初始化时通过new Array(yearArrLength).fill(0)填充了无效的0元素,后续的查找匹配逻辑会因此出现异常。 - 字段兼容缺失:你提供的原始数据中,第二个账户的名字段为
Name,不是统一的AccountName,只读取AccountName会导致第二个账户名称获取失败,匹配逻辑失效。 - 循环逻辑冗余:使用
Object.keys遍历数组属于冗余写法,多层嵌套循环也会降低执行效率。
修正代码
假设你预先定义的年份数组为const yearsArr = ["2015", "2016"],修正后代码如下:
const yearsArr = ["2015", "2016"] const yearArrLength = yearsArr.length; // 初始化空数组存储结果 const generatedObj = []; // 生成账户初始结构 for (const item of userData.Data) { // 兼容两种账户名字段 const accName = item.AccountName || item.Name; if (!generatedObj.find(entry => entry.name === accName)) { // 每次生成独立的空白数组,避免引用共享 const blankData = new Array(yearArrLength).fill(0); generatedObj.push({ name: accName, data: blankData }); } } // 填充对应年份的金额 for (const item of userData.Data) { const accName = item.AccountName || item.Name; const yearIndex = yearsArr.indexOf(item.Year); const targetAccount = generatedObj.find(entry => entry.name === accName); if (targetAccount && yearIndex !== -1) { targetAccount.data[yearIndex] = item.Amount; } }
运行上述代码即可得到你预期的输出结果。
内容的提问来源于stack exchange,提问作者MeltingDog
相关产品推荐
相关产品推荐

