JavaScript数组对象匹配cId更新flag,未匹配项保留原flag
解决思路与代码实现
核心逻辑很简单:只在找到匹配项时更新impFlag,未匹配的项不做赋值操作,自然保留原字段值。
为了提升匹配效率(避免每次遍历arr1都全量扫描arr2),建议先把arr2转成以cId为键的映射表,再遍历arr1处理:
方法1:使用Map(推荐,支持各种类型的cId)
// 先将arr2转换为cId到impFlag的映射 const cIdFlagMap = new Map(arr2.map(item => [item.cId, item.impFlag])); // 遍历arr1更新字段 arr1.forEach(item => { // 仅当存在匹配的cId时,才更新impFlag if (cIdFlagMap.has(item.cId)) { item.impFlag = cIdFlagMap.get(item.cId); } // 无匹配时不执行任何操作,保留原impFlag值 });
方法2:使用普通对象(适合cId为字符串/数字的场景)
// 构建cId到impFlag的对象映射 const cIdFlagObj = arr2.reduce((acc, item) => { acc[item.cId] = item.impFlag; return acc; }, {}); // 遍历处理arr1 arr1.forEach(item => { // 检查cId是否存在于映射中 if (item.cId in cIdFlagObj) { item.impFlag = cIdFlagObj[item.cId]; } });
原代码空值问题原因
原代码应该是不管有没有匹配到,都直接给impFlag赋值(比如item.impFlag = matchItem?.impFlag),当没有匹配项时matchItem为undefined,赋值后impFlag就变成undefined或空字符串。现在改成仅在匹配成功时才赋值,未匹配的项会保持原来的impFlag值。
内容的提问来源于stack exchange,提问作者Ashok
相关产品推荐
相关产品推荐

