JS中SensorData的Events子数组合并去重失效问题排查
问题根因
你的代码存在三处核心问题,导致拼接结果不符合预期:
- 循环索引起始错误:JavaScript数组索引从0开始计数,你写的循环初始值为
i=1,直接跳过了第一个(索引为0)传感器项的处理 - 赋值目标错误:你将拼接后的结果赋值给了
data.SensorData[i].Events,全程没有修改state.sensorData下的任何字段,打印state.sensorData[0].Events.length自然不会有变化 - 缺失去重逻辑:
Array.concat()仅做简单的数组合并,不会自动过滤重复事件,无法满足去重需求 - 空值风险:直接对可选链返回的结果调用
concat,如果某侧Events字段不存在(返回undefined),会直接抛出类型错误
修复代码
根据你的需求,合并对应索引项的Events、去重后赋值到目标数组即可,参考实现如下:
// 从索引0开始遍历,覆盖所有传感器条目 for (let i = 0; i < data.SensorData.length; i++) { // 空值兜底,避免Events字段不存在时调用方法报错 const newEvents = data.SensorData[i]?.Events ?? []; const oldEvents = state.sensorData[i]?.Events ?? []; // 合并后按事件唯一标识去重,此处以eventId作为唯一键为例,请替换为你实际业务中的唯一判断字段 const uniqueEvents = [...newEvents, ...oldEvents].filter((event, idx, arr) => { return arr.findIndex(item => item.eventId === event.eventId) === idx; }); // 如需将合并结果存在data.SensorData中保留此行,需更新state则替换赋值目标即可 data.SensorData[i].Events = uniqueEvents; }
注意事项
如果你的Events存储的是原始值(字符串、数字等),可以直接用
[...new Set([...newEvents, ...oldEvents])]快速去重;如果是对象类型,必须使用业务层面的唯一标识(比如事件ID、时间戳+事件类型的组合字段)判断重复,直接比较对象引用会导致内容相同的事件无法被正确去重。
内容的提问来源于stack exchange,提问作者Yujin Dong
相关产品推荐
相关产品推荐

