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

向数组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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 16:39:57