JS/TS对比对象数组 匹配相同id时为匹配项新增isConfirmed字段
问题根因
你写的filter逻辑只会返回object1中id匹配的元素子集,既不会保留未匹配的元素,也不会给匹配元素追加指定字段,和需求逻辑不符。
正确实现
这里提供两种常用实现,你可以根据是否需要修改原数组选择:
- 方案1:直接修改原
object1数组(无额外内存开销,适合允许直接改动原数据的场景)
// 先把object2的所有id存入Set,把id匹配查找的时间复杂度从O(n)降到O(1),数据量大时性能优势明显 const matchedIds = new Set(object2.map(item => item.id)); // 遍历原数组,给匹配到id的元素追加字段 object1.forEach(item => { if (matchedIds.has(item.id)) { item.isConfirmed = true; } });
- 方案2:生成全新数组,不改动原数组(适合不可变数据场景,比如前端框架状态更新)
const matchedIds = new Set(object2.map(item => item.id)); const result = object1.map(item => { return matchedIds.has(item.id) ? { ...item, isConfirmed: true } : item });
TS类型适配
如果TS编译提示属性不存在,可以给数组元素的类型补充可选字段声明:
interface AreaItem { id: number; city: string; isConfirmed?: boolean; // 可选字段,兼容追加属性后的结构 }
运行结果
用你提供的原始数据运行上述代码,输出结构和期望完全一致:
[ { "id": 10691, "city": "Morris", "isConfirmed": true }, { "id": 10692, "city": "NY" } ]
内容的提问来源于stack exchange,提问作者Diya Agastya
相关产品推荐
相关产品推荐

