TypeScript:根据指定的键值(默认为id)从数组A中筛选出存在于数组B中的元素,支持自定义键名,适用于多种数据结构的过滤场景。

function filterArrayByIds(
  A: Record<string, any>[],
  B: Array<string | number>,
  key: string = "id"
): Record<string,any>[] {
  const idSet = new Set(B);
  return A.filter((item:Record<string,any>) => idSet.has(item[key]));
}

从完整数据结构数组 `a` 中筛选 ID 存在数组 `b` 中的元素,有以下两种方法: #### 方法一:使用 `Set` 和 `filter` 方法 此方法适用于一般的 JavaScript 场景,通过 `Set` 数据结构提高查找效率,然后使用 `filter` 方法筛选元素。 ```javascript // 示例数组对象a const a = [ {id: 1, name: 'obj1'}, {id: 2, name: 'obj2'}, {id: 3, name: 'obj3'} ]; // 示例数组对象b const b = [ {id: 2, name: 'obj2 updated'}, {id: 4, name: 'new obj'} ]; const bIds = new Set(b.map(item => item.id)); const result = a.filter(item => bIds.has(item.id)); console.log(result); // 打印[{id: 2, name: 'obj2'}] ``` 该方法首先使用 `Set` 数据结构创建一个集合 `bIds`,它包含了数组对象 `b` 中所有元素的 `id` 值。这样后续通过 `has` 方法判断某个 `id` 是否存在时,时间复杂度为 O(1),比遍历数组查找更高效。然后通过 `filter` 方法对数组对象 `a` 进行过滤,只保留 `id` 在 `bIds` 集合中的元素,也就是筛选 `a` 中 `id` 存在于 `b` 中的元素 [^1]。 #### 方法二:使用自定义函数 此方法是一个 TypeScript 函数,支持自定义键名适用于多种数据结构过滤场景。 ```typescript function filterArrayByIds( A: Record<string, any>[], B: Array<string | number>, key: string = "id" ): Record<string,any>[] { const idSet = new Set(B); return A.filter((item:Record<string,any>) => idSet.has(item[key])); } // 示例数组对象a const a = [ {id: 1, name: 'obj1'}, {id: 2, name: 'obj2'}, {id: 3, name: 'obj3'} ]; // 示例数组对象b const b = [ {id: 2, name: 'obj2 updated'}, {id: 4, name: 'new obj'} ]; const bIds = b.map(item => item.id); const result = filterArrayByIds(a, bIds); console.log(result); // 打印[{id: 2, name: 'obj2'}] ``` 该函数接收三个参数:数组 `A`、数组 `B` 和用于判断唯一性的键名 `key`(默认为 `id`)。函数内部创建一个 `Set` 集合 `idSet`,包含数组 `B` 中的所有元素。然后使用 `filter` 方法对数组 `A` 进行过滤,只保留 `key` 值存在于 `idSet` 集合中的元素 [^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

保禄241225

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值