基于选择列表为数组对象新增键值对时的引用覆盖问题
解决同一对象被多次选中时键值覆盖的问题
看起来你遇到的核心问题是:当同一个对象匹配多个筛选条件时,直接赋值arrayPicklist会覆盖之前的值,而不是把多个字段名存成数组。我们来一步步修正你的代码:
问题分析
你的当前代码里有几个关键问题:
- 直接给
n.arrayPicklist赋值单个字段名,导致重复匹配时旧值被覆盖 - 代码里的
checkCheckboxOnOff.fieldName是错误的,应该引用当前循环项的fieldName(比如checkCheckboxOnOff[i].fieldName) - 最后push数组的方式有误,
opleidingfilter[i]会只push单个元素,应该处理整个筛选结果里的对象
修正后的代码示例
假设你的外层循环是遍历checkCheckboxOnOff数组,我们可以这样修改:
var checkCheckboxOnOff = [ {"fieldName":"Categorie__c","picklistValue":"Techniek"}, {"fieldName":"Regio__c","picklistValue":"Midden"} ]; var filter = []; // 假设这是你最终要收集的目标数组 var serverList = [ /* 你的原始数据数组,包含Id等字段 */ ]; // 遍历每个筛选条件 checkCheckboxOnOff.forEach(function(condition) { // 筛选匹配当前条件的对象 var opleidingfilter = serverList.filter(function(item) { return item[condition.fieldName] === condition.picklistValue; }); // 给每个匹配的对象添加/更新arrayPicklist数组 opleidingfilter.forEach(function(obj) { // 如果对象还没有arrayPicklist,先初始化为空数组 if (!obj.arrayPicklist) { obj.arrayPicklist = []; } // 避免重复添加同一个字段名(如果业务不需要去重可去掉这步) if (!obj.arrayPicklist.includes(condition.fieldName)) { obj.arrayPicklist.push(condition.fieldName); } // 把对象添加到filter数组,避免重复添加同一个对象 if (!filter.some(item => item.Id === obj.Id)) { filter.push(obj); } }); });
关键改进点
- 把
arrayPicklist设计成数组类型,每次匹配新条件时往数组里push字段名,而不是直接赋值覆盖 - 先检查对象是否已存在
arrayPicklist字段,不存在则初始化为空数组 - 添加了重复对象的判断,避免同一个对象被多次push到
filter数组里(如果你的业务需要重复添加对象可去掉这一步) - 使用
forEach遍历筛选条件,代码更清晰,避免索引i带来的潜在错误
预期效果
比如你的serverList里有一个Id为121的对象同时匹配两个条件,最终这个对象的arrayPicklist会是["Categorie__c", "Regio__c"],而不是被覆盖成最后一个字段名。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

