JavaScript基于映射匹配修改数组文本值,解决输出结果全重复的问题
现存代码的核心问题
- 无意义的多层嵌套逻辑:你遍历
oringintalArrayOfObjs去匹配数据库记录的操作完全冗余——你的替换规则newObj的键本身就是数据库条目id,根本不需要通过原始数组做中间层匹配,这是导致后续循环覆盖问题的根源。 - 循环层级完全错位:你把
newArr构建、result赋值全写在了oringintalArrayOfObjs的每次循环内部,每遍历一次原始数组元素,就会把整个结果集全量重算并覆盖,最终只剩最后一次循环的计算结果。 - 逻辑判断偏移:在
arrOfValues.map循环里,你用外层固定的found(单条匹配的数据库记录)去遍历所有替换规则,导致每一次map循环的所有条目,最终changeOldToNew都会被最后一条替换规则覆盖成newObj['#6']也就是值'6',这是所有返回项文本部分全是'6'的直接原因。 - lodash语法使用错误:
_.forEach(newObj, (key, value) => {})的回调参数顺序完全反了,lodash的_.forEach对对象遍历的回调参数是(value, key),接反后判断逻辑从根上就无法正常运行。 - 多余的无意义操作:你写的
{ ...item.text, ... }是把字符串类型的item.text做对象展开,根本达不到保留原有字段的作用,属于无效操作。
最小化修正方案
整个逻辑完全不需要嵌套两层循环,直接基于已经拿到的数据库记录数组(arrOfValues,本身就带有数据库条目id)做一次遍历即可:
- 遍历
arrOfValues的每一条数据库记录,检查该记录的id是否存在于newObj的键中 - 存在则用
newObj对应的值替换原记录的text字段,不存在则保留原text值 - 所有记录处理完成后,统一将每条记录拼接为
text: value格式的字符串
修正后代码
// 修正原newObj的语法错误(原代码#2键值对后缺少逗号) const newObj = { '#1': '1', '#2': '2', '#3': '3', '#4': '4', '#5': '5', '#6': '6' } // 直接基于数据库返回的记录数组做一次性处理,无需嵌套原始数组循环 const processedResult = arrOfValues.map(dbRecord => { // 匹配替换规则,命中则用目标文本覆盖,未命中保留原文本 const finalText = newObj[dbRecord.id] || dbRecord.text return { text: finalText, value: dbRecord.value } }).map(item => `${item.text}: ${item.value}`)
上述逻辑运行后,会直接输出符合你预期的
["1: 1", "2: 2", "3: 3", "4: 4", "5: 5", "6: 6", "7: 7"]格式,完全避免了嵌套循环覆盖结果、固定值污染所有条目的问题。
内容的提问来源于stack exchange,提问作者invrt
相关产品推荐
相关产品推荐

