两个对象数组按ID匹配赋值异常排查及更优实现咨询
问题分析与解决方案
嘿,我来帮你揪出问题所在,再给你几个更靠谱的实现方式~
为什么你的代码会把所有subname都设成'-'?
你嵌套两层forEach的逻辑有个坑:比如处理data里id=1的对象时,内层第一次匹配到subs里id=1的项,确实把d.subname设成了'Temprano',但内层循环还会继续遍历subs里剩下的id=4、7的项,这两次匹配失败,会把之前刚设好的正确值覆盖成'-'。所有data对象都会经历这个“先对后错”的过程,最后自然全是'-'了。
快速修复:用find替代内层循环
直接在data的遍历里,用find找对应id的subs项,找到就取name,找不到就设'-',这样不会有覆盖问题:
data.forEach((d) => { const matchedSub = subs.find(s => s.id === d.id); d.subname = matchedSub ? matchedSub.name : '-'; });
更高效的方案:用Map做映射(适合大数组场景)
如果subs的长度可能很大,每次用find逐个查找效率不高,不如先把subs转成以id为键的Map,后续查找都是O(1)的时间复杂度:
// 先把subs转成id到name的映射表 const subsMap = new Map(subs.map(s => [s.id, s.name])); // 遍历data赋值 data.forEach((d) => { d.subname = subsMap.get(d.id) || '-'; });
这个方法不管subs后续怎么增减,只要重新构建一次Map就可以,非常灵活。
内容的提问来源于stack exchange,提问作者Piero Pajares
相关产品推荐
相关产品推荐

