向数组data属性添加对象时值被覆盖且异常变更,求排查
问题分析与解决
核心问题1:赋值逻辑错误,直接覆盖整个data对象
你的代码中每次匹配到字段时,执行:
arr["data"] = { ...obj };
这会完全替换arr.data对象,而非将新字段合并到现有对象中。比如第一次匹配raucher时,arr.data变为{raucher: "true"};后续匹配alter时,arr.data被替换成{alter: "65"};如果循环中再次匹配到raucher且此时value为false,arr.data会被替换成{raucher: false}——你看到的结果同时存在两个字段,说明循环中可能出现了意外的合并场景,但本质逻辑是错误的覆盖而非合并。
核心问题2:双层循环导致重复处理字段
外层遍历formComponentsArray、内层遍历payload的结构,会导致同一个字段被多次匹配处理。如果payload中存在raucher: false的条目,在后续循环中被匹配到,就会覆盖之前raucher: "true"的值,这就是它变成false的原因。
修复方案
1. 修改赋值逻辑为合并字段
将直接替换改为合并现有data与新字段,确保每次新增的键值对都保留:
// 先初始化data为空对象,避免第一次合并时出现undefined if (!arr["data"]) { arr["data"] = {}; } // 合并现有data和新obj的键值对 arr["data"] = { ...arr["data"], ...obj };
也可以用Object.assign实现相同效果:
arr["data"] = Object.assign(arr["data"] || {}, obj);
2. 优化循环逻辑(避免重复遍历)
先将payload转换为以fieldID为键的映射对象,再直接遍历formComponentsArray赋值,既提升效率又避免重复处理:
var arr = []; arr["data"] = {}; // 把payload转为键值对映射,方便快速查找 var payloadMap = {}; for (var z = 0; z < payloadLength; z++) { var fieldID = payload[z].fieldID.toLowerCase(); payloadMap[fieldID] = payload[z].value; } // 遍历组件数组直接赋值 for (var i = 0; i < componentsLength; i++) { var path = formComponentsArray[i].path; if (payloadMap.hasOwnProperty(path)) { arr["data"][path] = payloadMap[path]; } }
内容的提问来源于stack exchange,提问作者mm1975
相关产品推荐
相关产品推荐

