TypeScript中按id匹配用另一对象属性值修改目标对象属性
实现方案
步骤1:构建id到imageURL的映射表
先把arr2处理为Map结构,避免多次遍历arr2,提升执行效率:
const imageUrlMap = new Map(arr2.map(item => [item.id, item.imageURL]));
步骤2:遍历arr1修改匹配项的对应属性
直接遍历arr1,匹配到id存在的场景下仅更新imageURL字段,不会修改对象其他属性,也不会替换整个对象:
arr1.forEach(item => { if (imageUrlMap.has(item.id)) { item.imageURL = imageUrlMap.get(item.id)!; // 此处非空断言!是因为已经提前判断过map中存在该id,可安全使用 } });
完整带类型约束的TypeScript示例
如果需要明确TS类型,可以补充类型定义:
// 定义通用对象类型 interface UserItem { id: number; name: string; imageURL: string; } let arr1: UserItem[] = [{id:1, name:'test user', imageURL:''}, {id:1, name:'test user', imageURL:''}, {id:1, name:'test user 3', imageURL:''}]; let arr2: UserItem[] = [{id:1, name:'test user', imageURL:'abcdefghijklmnop'}]; const imageUrlMap = new Map<number, string>(arr2.map(item => [item.id, item.imageURL])); arr1.forEach(item => { const targetUrl = imageUrlMap.get(item.id); if (targetUrl) { item.imageURL = targetUrl; } });
实现说明
- 仅修改
imageURL单一属性,不会替换整个对象,符合要求 - 时间复杂度为O(arr1长度 + arr2长度),比双重循环的O(arr1*arr2)效率更高,尤其适合数组元素较多的场景
- 当arr2中存在多个相同id的元素时,默认取最后一个出现的id对应的imageURL,如有特殊去重逻辑可自行调整映射表构建规则
内容的提问来源于stack exchange,提问作者Daniel
相关产品推荐
相关产品推荐

