NodeJS合并带嵌套键的两份数据时输出元素全部相同问题排查
问题原因
你遇到的是JavaScript对象引用共享的问题,具体触发逻辑如下:
- 你没有在赋值前判断
data1中是否存在statistic.label对应的键,你的初始化逻辑应该是直接把已有的类别(比如qrCode)的日期对象直接赋值给了新增的类别键,导致所有新增类别都和原有类别指向同一个内存地址的对象。 - 此时你修改任意一个类别下的日期值,所有共享该引用的类别值都会同步修改,最终呈现出所有类别值完全一致的现象。同时你的现有逻辑也不会给新增类别生成独立的默认值结构。
修复方案
首先提前定义所有日期的默认值模板,每次新增类别时拷贝模板生成独立对象,避免引用共享:
// 第一步:定义统一的日期默认模板,所有日期初始值为0 const dateTemplate = { "2021-10-03": 0, "2021-10-04": 0, "2021-10-05": 0, "2021-10-06": 0, "2021-10-07": 0, "2021-10-08": 0, "2021-10-09": 0 }; // 第二步:修改遍历合并逻辑 data2.forEach((statistic) => { // 不存在对应类别时,先拷贝模板创建独立的默认结构 if (!data1[statistic.label]) { data1[statistic.label] = {...dateTemplate }; } // 再更新对应日期的分数 data1[statistic.label][statistic.date] = Number(statistic.score); });
如果你的日期范围是动态的,也可以提前从现有类别中提取所有日期生成模板:
// 从已有类别中提取所有日期生成模板 const existDates = Object.keys(data1.qrCode); const dateTemplate = Object.fromEntries(existDates.map(date => [date, 0]));
内容的提问来源于stack exchange,提问作者Cagrison
相关产品推荐
相关产品推荐

